我有三个脚本,scheduler.py
这是一个基于multiprocessing.Process
and的并行任务运行multiprocessing.Pipe
器,第二个脚本是simulation.pyx
一个包含一些我想通过并行执行的类和函数的脚本scheduler.py
,最后是一个小的主脚本,我在其中创建一个实例并行化类scheduler.py
,将它传递给类simulation.pyx
并运行整个事情。
当目标并行函数位于顶层时,simulation.pyx
一切正常,但是一旦我尝试使用scheduler.py
类函数,simulation.pyx
就会出现酸洗错误。
由于代码有几千行,我只给出一些概念代码:
small_main_script.py
:
import simulation
import scheduler
if __name__ == '__main__':
main = simulation.Main()
scheduler = scheduler.parallel()
main.simulate(scheduler)
simulation.pyx
:
import scheduler
cdef do_something_with_job(job):
...
cdef class Main:
cdef public ...
...
def __init__(self):
...
def some_function(self,job):
...
do_something_with_job(job)
...
def simulate(self, scheduler):
for job in job_list:
scheduler.add_jobs(job)
scheduler.target_function = self.some_function
scheduler.run_in_parallel()
问题是,如果我使用无用的虚拟函数,比如
def sleep(job):
time.sleep(2)
并将它放在顶层,即在类之外,并行化工作正常,但是一旦我把它放在类中,Main
我就会得到一个酸洗错误。如果我使用在类中定义的真实目标函数Main
并且我不想将其移动到顶层,我会得到同样的错误。以下是我sleep(self,job)
在类中使用虚拟函数时发生的情况Main
。当它在课堂之外时,它工作得很好。
PicklingError: Can't pickle <built-in method sleep of simulation.Main
object at 0x0D4A3C00>: it's not found as __main__.sleep
In [2]: Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Python27\lib\multiprocessing\forking.py", line 381, in main self = load(from_parent)
File "C:\Python27\lib\pickle.py", line 1384, in load return Unpickler(file).load()
File "C:\Python27\lib\pickle.py", line 864, in load dispatch[key](self)
File "C:\Python27\lib\pickle.py", line 886, in load_eof
raise EOFError
EOFError
我正在使用 Python 2.7
更新
我设法进一步隔离了这个问题。使用第三方包时pathos multiprocessing
,我可以腌制类函数。现在的问题似乎是在使用作为类实例的函数参数时出现错误。