我想在Python中的进程中运行的函数中修改列表值。下面是它的行为示例。
在python shell中,我定义了一个函数:
代码:
>>> def myfct2(n):
... for i in range(len(n)):
... n[i] = i
... time.sleep(3)
然后用"无"列表执行:
代码:
N=[None]*4
>>> N
[None, None, None, None]
>>> myfct(N)
>>> N
[0, 1, 2, 3]
列表会更改,因为它是可变的。
现在,如果我在一个过程中做同样的事情,它的行为会有所不同:
代码:
proc=multiprocessing.Process( target=myfct,args=(N,),daemon=True)
N=[None]*4
>>> proc.start()
>>> proc.is_alive()
True
>>> proc.is_alive()
True
>>> proc.is_alive()
True
>>> proc.is_alive()
True
>>> proc.is_alive()
True
>>> proc.is_alive()
False
>>> N
[None, None, None, None]
有人能告诉我如何修改通过流程传递给函数参数的可变对象吗?
我想你错过了proc.join()
。上面的代码在python 3中对我有效。Join使主进程在完成之前等待您创建的进程。因此,脚本可能是在函数中的计算完成之前完成的。
import multiprocessing
import time
def myfct2(n):
for i in range(len(n)):
n[i] = i
time.sleep(3)
print(n)
N=[None]*4
proc=multiprocessing.Process( target=myfct2,args=(N,))
proc.start()
proc.join()