Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python ThreadPoolExecutor线程安全吗?_Python_Multithreading_Concurrency - Fatal编程技术网

python ThreadPoolExecutor线程安全吗?

python ThreadPoolExecutor线程安全吗?,python,multithreading,concurrency,Python,Multithreading,Concurrency,比如,当我写同一个文件时,我应该手动添加锁以保证他们一个接一个地写它吗 我指的是并发的。期货。线程池执行器 我知道java执行器是线程安全的 例如: 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) 在本例中,

比如,当我写同一个文件时,我应该手动添加锁以保证他们一个接一个地写它吗

  • 我指的是并发的。期货。线程池执行器

  • 我知道java执行器是线程安全的

例如:

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中执行任务时,每个
其他\u数据
都附加在\u数据的
部分
旁边


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

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

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

submit()。当您提交要在线程池中执行的新函数时,您的函数将被放置在线程安全
队列的实例中。SimpleQueue
。然后,工作线程在此队列上阻塞,等待弹出提交的函数以执行它们。因为队列是线程安全的,所以提交函数的调度是线程安全的,这意味着您提交的函数都不会孤立(不执行)或执行两次


非线程安全的部分是内部
\u adjust\u thread\u count()
方法。它可以同时从两个不同的线程调用,创建一个争用,其中两个线程都看到
num\u threads
,并且都创建新线程来填充线程池。但是,如果发生这种情况,那也没关系,因为它只会在线程池中产生额外的线程。对于大多数项目来说,这几乎不是一个需要关注的问题。

您能否澄清一下您想要做什么,因为对于某些事情,它是线程安全的,而对于其他事情,则不是很多。从技术上讲,所有Python(至少是CPython)都是线程安全的,因为后台有可怕的GIL,阻止任何两个线程同时运行,但这并不排除非原子操作的部分结果和数据损坏的可能性。如果配置为max_workers=1,ThreadPoolExecutor一次只能运行一个任务。否则,任务可以在不同的线程中并发运行,您将需要额外的锁定。这将与工人池的想法相矛盾,因为这可能会在持有锁时阻止一名工人。顺便说一句,Java中的ThreadPoolExecutor在这方面具有相同的行为。