我想将计算作业分配给多个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应该是全部的。但它根本没有变化。为什么? 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完成计算?任何人都可以提供一种充分利用multi-cpus的方法吗?
答案 0 :(得分:1)
有两个问题:
当您最后打印阵列时,您如何知道您的流程已经完成?您需要在每个流程上调用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)
尝试按p.join()
更改行pass
,看看会发生什么:)
答案 1 :(得分:0)
这是因为print(myarray)
语句在进程结束之前执行。您应该等待进程结束,然后执行此语句。请注意以下thread.join()
声明。
import numpy as np
import threading
lock = threading.RLock()
thread_list = []
def func(begin,end):
print('*'*5)
print('begin=%d' %(begin))
for i in range(begin,end):
for j in range(10):
with lock:
myarray[i][j]=1
myarray=np.zeros((12,10))
print(myarray)
for i in range(4):
begin=i*3
end=(i+1)*3
p=threading.Thread(target=func,args=(begin,end,))
p.start()
thread_list.append(p)
print('*'*5)
for thread in thread_list:
thread.join()
print(myarray)