python多处理:进程不起作用

时间:2015-08-31 03:31:50

标签: 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应该是全部的。但它根本没有变化。为什么? 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的方法吗?

2 个答案:

答案 0 :(得分:1)

有两个问题:

  1. 当您最后打印阵列时,您如何知道您的流程已经完成?您需要在每个流程上调用join()以确保它们已完成。

  2. 每个进程都有一个“myarray”的副本。如果您想要传达多个流程,则需要使用QueuePipe。查看the documentation that talks about exchanging data between processes

  3. 这是一个工作示例,使用您发布的作为基础(它不是为了快速,只是为了显示通信是如何完成的):

    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)