jaz*_*lue 2 python pass-by-reference pass-by-value threadpool python-multiprocessing
我一直在尝试以下方法:
from multiprocessing import Pool
def f(some_list):
some_list.append(4)
print 'Child process: new list = ' + str(some_list)
return True
if __name__ == '__main__':
my_list = [1, 2, 3]
pool = Pool(processes=4)
result = pool.apply_async(f, [my_list])
result.get()
print 'Parent process: new list = ' + str(my_list)
Run Code Online (Sandbox Code Playgroud)
我得到的是:
Child process: new list = [1, 2, 3, 4]
Parent process: new list = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
因此,这意味着my_list是按值传递的,因为它没有突变。那么,是否将规则传递给另一个进程时确实按值传递规则呢?谢谢。
正如AndréLaszlo所说,该multiprocessing
库需要对传递给multiprocessing.Pool
方法的所有对象进行腌制,以将它们传递给工作进程。酸洗过程导致在工作进程中创建一个不同的对象,因此在工作进程中对该对象所做的更改不会影响父对象中的对象。在Linux上,对象有时会通过fork
继承(例如multiprocessing.Process(target=func, args=(my_list,))
)传递给子进程,但在这种情况下,最终会在子进程中获得对象的写时复制版本,因此当您进行操作时,仍然会得到不同的副本尝试在任一过程中对其进行修改。
如果确实要在进程之间共享对象,则可以multiprocessing.Manager
为此使用a :
from multiprocessing import Pool, Manager
def f(some_list):
some_list.append(4)
print 'Child process: new list = ' + str(some_list)
return True
if __name__ == '__main__':
my_list = [1, 2, 3]
m = Manager()
my_shared_list = m.list(my_list)
pool = Pool(processes=4)
result = pool.apply_async(f, [my_shared_list])
result.get()
print 'Parent process: new list = ' + str(my_shared_list)
Run Code Online (Sandbox Code Playgroud)
输出:
Child process: new list = [1, 2, 3, 4]
Parent process: new list = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2144 次 |
最近记录: |