关于python3多处理的参数

时间:2018-10-28 08:17:10

标签: python python-3.x multiprocessing

我正在学习多处理,但是当我想创建一个进程池时,遇到一个问题。我的代码是:

from multiprocessing import Pool, Queue

def read(q):
    print("flag")
    while not q.empty():
        value = q.get()
        print('Get %s from queue.' % value)

if __name__=='__main__':
    q = Queue()
    for i in range(4):
        q.put(i)
    p = Pool(4)
    for i in range(4):
        p.apply_async(read, args=(q,))
    p.close()
    p.join()
    print("down")

子进程似乎未运行,子进程没有输出。结果是

down

我想它与参数有关,所以我更改了代码:

from multiprocessing import Pool, Queue

def read(i):
    print("flag")
    print(i)
    #while not q.empty():
        #value = q.get()
        #print('Get %s from queue.' % value)

if __name__=='__main__':
    q = Queue()
    for i in range(4):
        q.put(i)
    p = Pool(4)
    for i in range(4):
        p.apply_async(read, args=(i,))
    p.close()
    p.join()
    print("down")

结果是:

flag
0
flag
2
flag
1
flag
3
down

进程已输出。那么为什么以前的代码无法正确运行?

感谢帮助。

1 个答案:

答案 0 :(得分:1)

您的第一个问题是必须对get()的每个结果调用apply_async(),否则将不会发生任何事情。例如,尝试以下操作:

if __name__=='__main__':
    q = Queue()
    for i in range(4):
        q.put(i)
    p = Pool(4)
    results = []
    for i in range(4):
        results.append(p.apply_async(read, args=(q,)))
    p.close()
    p.join()
    for result in results:
        print(result.get())
    print("down")

这会给你一个错误:

  

RuntimeError:队列对象仅应通过继承在进程之间共享

您的第二个问题是您没有正确使用队列-请参阅此处:Sharing a result queue among several processes