所以我刚刚编写了一个带有多处理,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()
答案 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
的输出。