并发编程 - Python 进程 - 竞争条件 - 示例是否会导致竞争条件?
Concurrent Programming - Python Processes - Race Condition - Is Example causes race condition or not?
嗨,精彩的 Whosebug 社区,
我知道当一组操作的共享输出取决于哪个进程先完成时,可能会出现竞争条件。我想知道全局变量,一个列表,是否会受到竞争条件的影响。
from concurrent.futures import ProcessPoolExecutor
def non_race_condition(value):
return value + 10
if __name__ == '__main__':
holder = [] # will this be impacted?
with ProcessPoolExecutor() as pool:
for x in pool.map(non_race_condition,[10 for _ in range(10)]):
holder.append(x)
print(holder)
我的直觉告诉我,竞争条件不应该影响持有者,因为进程没有共享内存来读写。我的直觉是正确的吗?非常感谢!
回答你的问题:map
方法保证 return 导致作业提交顺序,因此不存在竞争条件问题。但是即使没有订单保证,你怎么能以 holder
为你的例子而不是 [20] * 10
呢?
但是,如果您将示例更改为 for x in pool.map(non_race_condition, range(10)):
,那么 holder
将始终是 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
,因为 map
根据定义以非常特定的顺序固定输出,就像标准的 non-multiprocessing、built-in map
函数一样。但是,如果您改为启动多个进程,并向这些进程传递了进程将结果写入的 multiprocessing.Queue
实例,那么您将遇到竞争条件,并且结果写入队列的顺序将是不确定的除非您编写额外的代码以某种方式确保结果按特定顺序写入。这是因为不能保证仅仅因为一个进程是第一个启动的进程,它就会自动成为第一个将其结果写入队列的进程;影响这一点的因素太多了。
嗨,精彩的 Whosebug 社区,
我知道当一组操作的共享输出取决于哪个进程先完成时,可能会出现竞争条件。我想知道全局变量,一个列表,是否会受到竞争条件的影响。
from concurrent.futures import ProcessPoolExecutor
def non_race_condition(value):
return value + 10
if __name__ == '__main__':
holder = [] # will this be impacted?
with ProcessPoolExecutor() as pool:
for x in pool.map(non_race_condition,[10 for _ in range(10)]):
holder.append(x)
print(holder)
我的直觉告诉我,竞争条件不应该影响持有者,因为进程没有共享内存来读写。我的直觉是正确的吗?非常感谢!
回答你的问题:map
方法保证 return 导致作业提交顺序,因此不存在竞争条件问题。但是即使没有订单保证,你怎么能以 holder
为你的例子而不是 [20] * 10
呢?
但是,如果您将示例更改为 for x in pool.map(non_race_condition, range(10)):
,那么 holder
将始终是 [10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
,因为 map
根据定义以非常特定的顺序固定输出,就像标准的 non-multiprocessing、built-in map
函数一样。但是,如果您改为启动多个进程,并向这些进程传递了进程将结果写入的 multiprocessing.Queue
实例,那么您将遇到竞争条件,并且结果写入队列的顺序将是不确定的除非您编写额外的代码以某种方式确保结果按特定顺序写入。这是因为不能保证仅仅因为一个进程是第一个启动的进程,它就会自动成为第一个将其结果写入队列的进程;影响这一点的因素太多了。