首頁  >  文章  >  為什麼在 aws-sdk-go 中動態設定檔案大小並儲存在記憶體中 getObject 需要更長的時間?

為什麼在 aws-sdk-go 中動態設定檔案大小並儲存在記憶體中 getObject 需要更長的時間?

PHPz
PHPz轉載
2024-02-08 22:15:33694瀏覽

在使用 aws-sdk-go 進行檔案操作時,有時我們需要動態設定檔案大小並將其儲存在記憶體中。然而,當我們使用 getObject 方法來取得這個檔案時,可能會發現取得時間較長。這是因為在 aws-sdk-go 中,getObject 方法是基於 HTTP 協定的,而 HTTP 協定對於大檔案的傳輸需要更多的時間和資源。因此,當我們動態設定檔案大小並儲存在記憶體中時,可能會導致 getObject 方法的執行時間變長。為了減少這種情況的發生,我們可以考慮使用其他更適合大檔案傳輸的方法,例如分段下載或使用多執行緒下載等。

問題內容

我嘗試理解ForkJoinPool。我實際上不明白 fork 方法在沒有 join 和結束條件的情況下做什麼。 如果fork發送一個要在佇列中執行的任務,那麼為什麼這段程式碼不會無限地運行呢?

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();
        }
    }
}

結果總是不同的。

第二個問題:如果你在計算中呼叫 self fork 會發生什麼事?

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

計算將會被呼叫 1 或 2 次。

或這個:

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

計算將會呼叫多次,然後停止。

解決方法

確實無限地運行,但它們守護執行緒不會阻止JVM 關閉,因此它們會在主執行緒完成後(即立即關閉)關閉。設定一個無限循環來阻止主執行緒完成,您將看到您的任務無限進行。

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();
    }
}

以上是為什麼在 aws-sdk-go 中動態設定檔案大小並儲存在記憶體中 getObject 需要更長的時間?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除