簡體   English   中英

python ThreadPoolExecutor 線程安全嗎?

[英]is python ThreadPoolExecutor thread safe?

就像期貨寫同一個文件時我應該手動加鎖以保證他們一一寫嗎?

  • 我的意思是concurrent.futures.ThreadPoolExecutor

  • 而且我知道 java executor 是線程安全的

一個例子:

def task():
    with open("somefile", "a") as fh:
        fh.write(part_of_data)
    do_something()
    with open("somefile", "a") as fh:
        fh.write(other_data)

在這個例子中,當在 ThreadPoorExecuter 中執行任務時,我想確保 each other_data附加到part_of_data旁邊

我不確定with語句是原子操作,但如果不是,執行程序還應保證文件正確打開和關閉

這是我在查看標准庫中ThreadPoolExecutor的實現后的研究:

shutdown()方法是線程安全的,因為它在修改共享狀態之前需要鎖定。

submit()方法僅在其某些操作中是線程安全的,但實際上並不重要。 當您提交要在線程池中執行的新函數時,您的函數將放置在線程安全queue.SimpleQueue的實例中。 然后工作線程阻塞在這個隊列上,等待彈出提交的函數來執行它們。 因為隊列是線程安全的,所以提交函數的分派是線程安全的,這意味着您提交的任何函數都不會孤立(未執行)或執行兩次。

不是線程安全的部分是內部_adjust_thread_count()方法。 它可以同時從兩個不同的線程調用,創建一個競爭,其中兩個線程都看到num_threads < self._max_workers並且都創建新線程來填充線程池。 但是,如果發生這種情況,也沒關系,因為它只會導致線程池中出現額外的線程。 對於大多數項目來說,這幾乎不是一個需要關心的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM