使用多处理后,python脚本不会退出

时间:2017-02-07 18:16:12

标签: python-3.x multiprocessing

所以我刚刚编写了一个带有多处理,Pool()和Queue()的简单代码,当我用这个命令执行它时,它一直保持打开状态

python3 m.py

我可以看到我的5个Cpu核心完成了这项工作,并且cpu使用率降低到正常水平但钢铁没有关闭,我必须按Ctrl + c退出它。

这是我的代码:

    from multiprocessing import Queue,Pool
    import csv,json
    from itertools import chain

    def worker(line):
     j_string = json.dumps(line)
     worker.output_q.put(j_string)

    def worker_init(output_q):
     worker.output_q = output_q

    f_open = open('khodro','rt')
    f_csv = csv.reader(f_open)

    output_q = Queue()

    pool = Pool(5,worker_init,[output_q])
    pool.imap(worker,chain(f_csv),1000)
    raise SystemExit()

1 个答案:

答案 0 :(得分:0)

我不确切地知道原因,但问题在于您使用worker.output_q.put(j_string)填充输出队列。如果删除该行,则脚本会终止。如果您打印出正在打印的行,您会看到它在处理完最后一行后挂起。我猜是因为你最后没有明确地close()输出队列。事实上你不能,因为worker你不知道它是不是最后一行。

好消息是,当您在函数中imap时,您尝试使用输出队列实现的内容由return本身完成:

from multiprocessing import Queue,Pool
import csv,json
from itertools import chain

def worker(line):
    return json.dumps(line)

f_open = open('generated.json','rt')
f_csv = csv.reader(f_open)
pool = Pool(5)

for j_string in pool.imap(worker,f_csv,1000):
    print(j_string)

for循环遍历由imap填充的队列,因此内部(AFAIK)与您尝试实现的相同。

由于imap没有阻止,您可以在所有工作人员通过之前开始处理worker的输出。