【发布时间】:2017-07-24 17:11:43
【问题描述】:
就像我应该在futures写入同一个文件时手动添加锁以保证他们一个一个地写入它?
我的意思是 concurrent.futures.ThreadPoolExecutor
而且我知道 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 中执行任务时,我想确保每个 other_data 都附加到 part_of_data 旁边
我不确定with语句是否是原子操作,但如果不是,执行器也应该保证文件正确打开和关闭
【问题讨论】:
-
你能澄清你想要做什么,因为对于某些事情它是线程安全的,对于其他事情 - 不是那么多。从技术上讲,所有 Python(至少是 CPython)都是线程安全的,因为后台有可怕的 GIL 可以防止任何两个线程同时运行,但这并不排除非原子的部分结果和数据损坏的可能性操作。
-
如果配置为 max_workers=1,ThreadPoolExecutor 一次只会运行一个任务。否则,任务可以在不同的线程中同时运行,您将需要额外的锁定。这将与工人池的想法相矛盾,因为这可能会在持有锁的时间内阻塞一个工人。而且,顺便说一句:Java 中的 ThreadPoolExecutor 在这方面具有相同的行为。
标签: python multithreading concurrency