我想将我的计算工作分配给多个 CPU,所以我选择多处理。然而,结果并不是我想要的。
import numpy as np
from multiprocessing import Process
def func(begin,end):
print('*'*5)
print('begin=%d' %(begin))
for i in range(begin,end):
for j in range(10):
myarray[i][j]=1
myarray=np.zeros((12,10))
print(myarray)
for i in range(4):
begin=i*3
end=(i+1)*3
p=Process(target=func,args=(begin,end,))
p.start()
print('*'*5)
print(myarray)
我觉得myarray应该是all ones。但它根本没有改变。为什么? func 函数不会改变 myarray 的元素? 我尝试了此链接中的示例 enter link description here
from multiprocessing import Process
def f(name):
print('hello',name)
p=Process(target=f,args=('bob',))
p.start()
屏幕上什么也没有显示。为什么? 我应该如何用 python 完成我的计算?任何人都可以提供一种充分利用多 cpus 的方法吗?
最佳答案
这里有两个问题:
当你在最后打印你的数组时,你怎么知道你的进程已经完成了?您需要调用
join()
在每个过程中确保它们已经完成。每个进程都有一个“myarray”的副本。如果您想与多个进程通信,您需要使用
Queue
或Pipe
。检查the documentation that talks about exchanging data between processes
这是一个使用您发布的示例作为基础的工作示例(它不是为了快速,只是为了展示通信是如何完成的):
from multiprocessing import Process, freeze_support, Queue
def func(my_id, q, begin, end):
global myarray
print('Process %d has range: %d - %d' % (my_id, begin, end))
for i in range(begin,end):
q.put((i, i * 2))
if __name__ == "__main__":
freeze_support()
q = Queue()
processes = []
myarray=[0] * 12
print("At the beginning the array is ", myarray)
for i in range(4):
begin = i*3
end = (i+1)*3
p = Process(target=func, args=(i, q, begin, end))
p.start()
processes.append(p)
for p in processes:
p.join()
while not q.empty():
(index, value) = q.get()
myarray[index] = value
print("At the end the array is ", myarray)
尝试通过 pass
更改 p.join()
行,看看会发生什么:)
关于 python 多处理: processes don't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32303614/