当尝试使用多处理库(python 3.5)时,我遇到了没有结束的功能。所有似乎都已处理,但(主)程序不会继续......
我目前的设置如下:
# Main.py
import multiprocessing as mp
import pandas as pd
from dosomething import dosomething
csvfolder = 'data/'
data = pd.DataFrame([
{'a':12,'b':13},
{'a':2,'b':14},
{'a':1,'b':23},
{'a':123,'b':16},
{'a':142,'b':14},
])
print('start')
result = mp.Queue()
dos = mp.Process(target=dosomething, args=(data,csvfolder,result,'dosomething'))
dos.start()
dos.join()
result.get()
print('finished')
然后在dosomething中我定义了一个函数dosomething,它执行以下操作:
# dosomething.py
import os
def dosomething(data,csvfolder,result,name):
data.to_csv(os.path.join(csvfolder,'test.csv'))
result.put({name:{'data':data}})
看起来该函数按预期执行但从未结束导致主程序停止。结束程序时,我收到以下消息:
处理流程-1:回溯(最近一次调用最后一次):文件 " /usr/lib/python3.5/multiprocessing/process.py" ;,第252行,在 _bootstrap util._exit_function()文件" /usr/lib/python3.5/multiprocessing/util.py" ;,第314行,在 _exit_function _run_finalizers()File" /usr/lib/python3.5/multiprocessing/util.py" ;,第254行,in _run_finalizers 终结者()文件" /usr/lib/python3.5/multiprocessing/util.py",第186行,调用 res = self._callback(* self._args,** self._kwargs)File" /usr/lib/python3.5/multiprocessing/queues.py" ;, 198行in _finalize_join thread.join()File" /usr/lib/python3.5/threading.py" ;,第1054行,在join中 self._wait_for_tstate_lock()文件" /usr/lib/python3.5/threading.py",第1070行,在_wait_for_tstate_lock中 elif lock.acquire(block,timeout):KeyboardInterrupt
根据评论,我了解到result.put()是(当使用实际数据时)很多时间,变得反应迟钝。我放在这个队列上的结果是一个包含2个元素的字典,其中一个是pandas数据帧(几个100.000条记录)。
我该如何解决这个问题?
答案 0 :(得分:0)
...无论何时使用队列,您都需要确保在加入进程之前最终删除已放入队列的所有项目。
只需交换Process.join
和Queue.get
行即可使其正常运行。