在使用 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中文網其他相關文章!