2017-04-23 41 views
2

我是新来的Python的多,而且我写了下面的小脚本:问题与池和多模块的队列在Python

import multiprocessing 
import os 

def task(queue): 
    print(100) 

def run(pool): 
    queue = multiprocessing.Queue() 
    for i in range(os.cpu_count()): 
     pool.apply_async(task, args=(queue,)) 

if __name__ == '__main__': 
    multiprocessing.freeze_support() 
    pool = multiprocessing.Pool() 
    run(pool) 
    pool.close() 
    pool.join() 

我很奇怪,为什么不执行,有任务()方法运行此脚本后没有输出。任何人都可以帮我吗?

回答

2

它正在运行,但它正在死于主线程之外的错误,所以您看不到错误。因此,即使您不关心结果,异步调用的结果.get()总是好的:.get()将引发不可见的错误。

例如,改变你的循环,像这样:

tasks = [] 
for i in range(os.cpu_count()): 
    tasks.append(pool.apply_async(task, args=(queue,))) 
for t in tasks: 
    t.get() 

那么新t.get()将炸毁,结尾:

RuntimeError: Queue objects should only be shared between processes through inheritance 

总之,通过Queue对象Pool方法是不支持的。

但是你可以通过将它们传递给multiprocessing.Process()或者Pool初始化函数。例如,这里有一个办法做到后者:

import multiprocessing 
import os 

def pool_init(q): 
    global queue # make queue global in workers 
    queue = q 

def task(): 
    # can use `queue` here if you like 
    print(100) 

def run(pool): 
    tasks = [] 
    for i in range(os.cpu_count()): 
     tasks.append(pool.apply_async(task)) 
    for t in tasks: 
     t.get() 

if __name__ == '__main__': 
    queue = multiprocessing.Queue() 
    pool = multiprocessing.Pool(initializer=pool_init, initargs=(queue,)) 
    run(pool) 
    pool.close() 
    pool.join() 

在Linux-Y系统,你可以 - 因为原来的错误信息提示 - 使用过程中继承,而不是(但是这是不可能在Windows上)。

+0

谢谢。这真的有帮助! –