Python多处理:导入的函数没有结束

时间:2017-06-16 05:21:12

标签: python multiprocessing python-module

当尝试使用多处理库(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条记录)。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

来自multiprocessing guidelines

  

...无论何时使用队列,您都需要确保在加入进程之前最终删除已放入队列的所有项目。

只需交换Process.joinQueue.get行即可使其正常运行。