Heim >Java >Warum dauert getObject länger, wenn die Dateigröße dynamisch festgelegt und im Speicher in aws-sdk-go gespeichert wird?

Warum dauert getObject länger, wenn die Dateigröße dynamisch festgelegt und im Speicher in aws-sdk-go gespeichert wird?

PHPz
PHPznach vorne
2024-02-08 22:15:33699Durchsuche

Bei der Verwendung von aws-sdk-go für Dateivorgänge müssen wir manchmal die Dateigröße dynamisch festlegen und im Speicher speichern. Wenn wir jedoch die getObject-Methode verwenden, um diese Datei abzurufen, kann es sein, dass die Erfassungszeit länger ist. Dies liegt daran, dass in aws-sdk-go die getObject-Methode auf dem HTTP-Protokoll basiert und das HTTP-Protokoll mehr Zeit und Ressourcen für die Übertragung großer Dateien benötigt. Wenn wir die Dateigröße daher dynamisch festlegen und im Speicher speichern, kann dies dazu führen, dass die Ausführungszeit der getObject-Methode länger wird. Um das Auftreten dieser Situation zu reduzieren, können wir die Verwendung anderer Methoden in Betracht ziehen, die für die Übertragung großer Dateien besser geeignet sind, z. B. segmentierte Downloads oder die Verwendung von Multithread-Downloads.

Frageninhalt

Ich versuche, ForkJoinPool zu verstehen. Ich verstehe eigentlich nicht, was ich im Fall von fork 方法在没有 join und der Endbedingung tun soll. Wenn fork eine Aufgabe zur Ausführung in eine Warteschlange sendet, warum wird dieser Code dann nicht unbegrenzt ausgeführt?

import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveAction;

public class Main {

    public static void main(String[] args) {
        ForkJoinPool pool = new ForkJoinPool();
        pool.invoke(new Test());
    }

    static class Test extends RecursiveAction {

        @Override
        protected void compute() {
            System.out.println(Thread.currentThread().getName());
            Test test = new Test();
            test.fork();
        }
    }
}

Die Ergebnisse sind immer unterschiedlich.

Zweite Frage: Was passiert, wenn Sie in einer Berechnung self fork nennen?

@Override
protected void compute() {
      System.out.println(1);
      fork();
}

Die Berechnung wird 1 oder 2 Mal aufgerufen.

Oder das:

protected void compute() {
      System.out.println(1);
      fork();
      join();
}

Die Berechnung wird mehrmals aufgerufen und dann gestoppt.

Workaround

Es läuft unendlich, aber die Daemon-Threads verhindern nicht, dass die JVM heruntergefahren wird, sodass sie heruntergefahren werden, nachdem der Haupt-Thread fertig ist (d. h. sofort). Richten Sie eine Endlosschleife ein, um zu verhindern, dass der Hauptthread abgeschlossen wird, und Sie werden sehen, wie Ihre Aufgabe auf unbestimmte Zeit fortschreitet.

public static void main(String[] args) {
    ForkJoinPool pool = new ForkJoinPool();
    pool.invoke(new Test());
    while (true) {}
}

static class Test extends RecursiveAction {

    @Override
    protected void compute() {
        System.out.println(Thread.currentThread().getName());
        Test test = new Test();
        test.fork();
    }
}

Das obige ist der detaillierte Inhalt vonWarum dauert getObject länger, wenn die Dateigröße dynamisch festgelegt und im Speicher in aws-sdk-go gespeichert wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen