我想将我的计算作业分配给多个 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 完成我的计算?谁能给出一种充分利用多CPU的方法?

最佳答案

这里有两个问题:

  • 当你最后打印你的数组时,你怎么知道你的进程已经完成了?您需要在每个进程上调用 join() 以确保它们已完成。
  • 每个进程都有一个“myarray”的副本。如果要与多个进程通信,则需要使用 QueuePipe 。检查 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 行,看看会发生什么:)

    关于python 多处理 : processes don't work,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32303614/

    10-12 16:41