我正在使用Python的“multiprocessing”创建并行应用程序。进程需要共享一些数据,为此我使用一个“Manager”。然而,我有一些常见的函数,进程需要调用,并且需要访问由“Manager”对象存储的数据。我的问题是是否可以避免将“Manager”实例作为参数传递给这些常见函数,而是像全局变量一样使用它。换句话说,考虑以下代码:
这在我的机器上运行良好并返回
import multiprocessing as mp
manager = mp.Manager()
global_dict = manager.dict(a=[0])
def add():
global_dict['a'] += [global_dict['a'][-1]+1]
def foo_parallel(var):
add()
print var
num_processes = 5
p = []
for i in range(num_processes):
p.append(mp.Process(target=foo_parallel,args=(global_dict,)))
[pi.start() for pi in p]
[pi.join() for pi in p]
这在我的机器上运行良好并返回
p=[0,1,2,3,4,5]
。然而,这样做是否“规范”?这是否是一种好方法,就像定义add(var)
并调用add(var)
一样好?
l.append([l[-1] + 1])
时,您还添加了另一个嵌套列表。它应该是l.append(l[-1] + 1)
,这确实比使用+=
更好,但它仍然不是原子性的,因为它首先读取l[-1]
,然后才附加。我上面的解决方案通过使用锁来读取和更新来解决了进程间竞争条件,从而使整个操作在进程间层面上具有原子性。 - Darkonaut