python 多处理: processes don't work

标签 python multiprocessing

我想将我的计算工作分配给多个 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 的方法吗?

最佳答案

这里有两个问题:

  1. 当你在最后打印你的数组时,你怎么知道你的进程已经完成了?您需要调用 join()在每个过程中确保它们已经完成。

  2. 每个进程都有一个“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)

尝试通过 pass 更改 p.join() 行,看看会发生什么:)

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

相关文章:

c - Node : Performance of Native Addon vs External Binary

python - 使用 Easy install 安装 pip 后出错(在 mac 上)

python - 获取匹配某个url的Flask View 函数

c - 如何在fork()中的一个子进程中执行多个任务

python - 使用multiprocessing访问mysql时,总是报如下错误,如何解决?

python - 如何更改多处理共享数组大小?

ARM:启动/唤醒/唤醒其他 CPU 内核/AP 并传递执行起始地址?

python - 如何计算 python pandas 数据帧的第一条记录和最后一条记录之间的时间差

Python 多处理池 - 迭代对象方法?

python - Tensorflow:保存/恢复变量加载不正确