python 中的多处理器需要同步吗?
is synchronization needed with multiprocessor in python?
使用这样的代码时
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,它们是否以同步方式执行?
答案是每个进程都会收到一份列表副本,因此不会看到其他进程所做的更改。
要实现您想要的效果,您必须使用 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
multiprocessing
线程池只是线程,并没有任何一般同步共享对象的魔力。您需要使用锁来保护共享对象。
如果您的目标是以多处理方式计算某些东西,最好不要共享状态。
如果可能的话,我建议您使用 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-loop:
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]
使用这样的代码时
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,它们是否以同步方式执行?
答案是每个进程都会收到一份列表副本,因此不会看到其他进程所做的更改。
要实现您想要的效果,您必须使用 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
multiprocessing
线程池只是线程,并没有任何一般同步共享对象的魔力。您需要使用锁来保护共享对象。
如果您的目标是以多处理方式计算某些东西,最好不要共享状态。
如果可能的话,我建议您使用 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-loop:
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]