当要并行执行的功能位于其他文件中时,并行代码不起作用

时间:2019-05-10 13:33:15

标签: python parallel-processing multiprocessing

我有一个想要并行运行的简单函数。如果直接在主函数中指定了该函数,则一切正常。但是,如果从单独的Python文件(该文件创建为包含一系列辅助函数)中调用了完全相同的函数,则代码将失败,并显示以下错误:

任务无法反序列化。请确保函数的参数都是可拾取的。

我试图运行以下代码:

from joblib import Parallel, delayed
import multiprocessing
import otherFile as of

inputs = range(10) 
def processInput(i):
    return i * i

num_cores = multiprocessing.cpu_count()

results1 = Parallel(n_jobs=num_cores)(delayed(processInput)(i) for i in inputs) # this works
results2 = Parallel(n_jobs=num_cores)(delayed(of.processInput)(i) for i in inputs) # this fails

当我从文件的调用函数processInput()时,我只是在该.py文件中复制了相同的函数。

def processInput(i):
    return i * i

如果需要调用的函数位于单独的.py文件中,如何使并行化工作?

这是完整的错误:

results = Parallel(n_jobs=num_cores)(delayed(of.processInput)(i) for i in inputs)
Traceback (most recent call last):

  File "<ipython-input-387-d8dd1dc361a6>", line 1, in <module>
    results = Parallel(n_jobs=num_cores)(delayed(of.processInput)(i) for i in inputs)

  File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\lib\site-packages\joblib\parallel.py", line 934, in __call__
    self.retrieve()

  File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\lib\site-packages\joblib\parallel.py", line 833, in retrieve
    self._output.extend(job.get(timeout=self.timeout))

  File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\lib\site-packages\joblib\_parallel_backends.py", line 521, in wrap_future_result
    return future.result(timeout=timeout)

  File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\lib\concurrent\futures\_base.py", line 432, in result
    return self.__get_result()

  File "C:\Users\xxxxx\AppData\Local\Continuum\anaconda3\lib\concurrent\futures\_base.py", line 384, in __get_result
    raise self._exception

BrokenProcessPool: A task has failed to un-serialize. Please ensure that the arguments of the function are all picklable.*

2 个答案:

答案 0 :(得分:1)

不确定是否已检查导入的函数'of.processInput'是否在不使用多处理的情况下工作?如果它不起作用,则可能是其他人未指出的房间里的大象。也许你想念

__init__.py

或者也许是因为Python的import命令没有看到目录。要添加目录,您可以执行以下操作:

import sys; sys.path.append("path/to/otherFile/")

尽管我不确定您收到的错误消息是否与该问题有很远的联系。

答案 1 :(得分:0)

只是这样导入函数

from otherFile import processinput