python ThreadPoolExecutor 线程安全吗?

Yin*_*nLu 5 python concurrency multithreading

就像期货写同一个文件时我应该手动加锁以保证他们一一写吗?

  • 我的意思是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)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我想确保每个任务都other_data附加part_of_data在 ThreadPoorExecuter 中执行任务的时间旁边

我不确定该with语句是原子操作,但如果不是,则执行程序还应保证文件已正确打开和关闭

ldr*_*drg 9

这是我在查看标准库中ThreadPoolExecutor的实现后的研究:

shutdown()方法是线程安全的,因为它在修改共享状态之前需要锁定。

submit()方法仅在其某些操作中是线程安全的,但实际上无关紧要。当您提交要在线程池中执行的新函数时,您的函数被放置在线程安全的实例中queue.SimpleQueue。然后工作线程阻塞在这个队列上,等待弹出提交的函数来执行它们。因为队列是线程安全的,所以提交函数的分派是线程安全的,这意味着您提交的任何函数都不会孤立(未执行)或执行两次。

不是线程安全的部分是内部_adjust_thread_count()方法。它可以同时从两个不同的线程调用,创建一个竞争,两个线程都看到它num_threads < self._max_workers并且都创建新线程来填充线程池。但是,如果发生这种情况,也没关系,因为它只会导致线程池中出现额外的线程。对于大多数项目来说,这几乎不是一个需要关心的问题。

  • `_adjust_thread_count` 方法至少在 python 3.8 上以 `if self._idle_semaphore.acquire(timeout=0):` 开头。 (3认同)