是python中的多处理器需要同步?

时间:2015-02-23 18:50:01

标签: python multiprocessor

使用像这样的代码

def execute_run(list_out): 
   ... do something 

pool = ThreadPoolExecutor(6)
for i in list1:
    for j in list2:
            pool.submit(myfunc, list_out)
pool.join()

假设线程修改了list_out,他们是否以同步方式执行此操作?

3 个答案:

答案 0 :(得分:2)

multiprocessing线程池只是线程,并且没有任何魔法可以通常同步共享对象。您需要使用锁来保护共享对象。

答案 1 :(得分:1)

答案是每个进程都会收到列表的副本,因此不会看到其他进程所做的更改。

要实现您的目标,您必须使用Manager来创建列表代理。请注意,管理器代理类不知道成员何时发生变异。例如,如果列表代理的元素以某种方式发生变异,则列表代理无法知道这一点。您必须重新分配该成员才能刷新更改。文档中的一个例子:

# create a list proxy and append a mutable object (a dictionary)
lproxy = manager.list()
lproxy.append({})
# now mutate the dictionary
d = lproxy[0]
d['a'] = 1
d['b'] = 2
# at this point, the changes to d are not yet synced, but by
# reassigning the dictionary, the proxy is notified of the change
lproxy[0] = d

答案 2 :(得分:1)

如果您的目标是以多处理方式计算某些内容,那么最好不要共享状态。 如果有可能,我建议您使用multiprocessing中的简单map

from multiprocessing import Pool

input_list = []
for i in list1:
    for j in list2:
        input_list.append((i, j))

p = Pool()
result_list = p.map(do_something, input_list)

map的作用类似于for循环:

def naive_map(input_list, do_something):
   result = []
   for i in input_list:
     result.append(do_something(i))
   return result

因此,如果你想使用接受多个参数的函数,你可以使用lambda函数来解包元组。

  >> def your_function(v1, v2):
  >>        return v1+v2
  >> f = lambda (x,y): your_function(x, y)
  >> map(f, [(1,2),(3,4),(5,6)])
       [3, 7, 11]