我遇到了多处理方面的麻烦。这是我的计划的基本方案:
尝试从主进程调用函数的并行进程
class MainProcess():
def foo(self):
# do something
def main():
p = ParallelProcess(self)
p.start()
class ParallelProcess(multiprocessing.Process):
def __init__(self, mainProcess):
multiprocessing.Process.__init__(self)
self.mainProcess = mainProcess
def run(self):
self.mainProcess.foo()
我的实际程序要复杂得多,但这个例子完美地解释了我的代码结构。我得到的错误与泡菜有关。 据我所知,我得到这种类型的错误,因为mainProcess不可选。但是,我不知道除了上面显示的模式或代码结构之外还使用哪种其他模式或代码结构。 任何帮助将非常感激。
根据要求,确切的错误是:
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Program Files\PsychoPy2\lib\multiprocessing\forking.py", line 342, in main
self = load(from_parent)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 1370, in load
return Unpickler(file).load()
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 858, in load
dispatch[key](self)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 880, in load_eof
raise EOFError
EOFError
Traceback (most recent call last):
File "C:\Users\user\workspace\Eyelink1.1\gcwindow_main.py", line 17, in <module>
main()
File "C:\Users\user\workspace\Eyelink1.1\gcwindow_main.py", line 9, in main
wrapper.run() # start collecting data on a separate process
File "C:\Users\user\workspace\Eyelink1.1\pylinkwrapper.py", line 149, in run
exp.start()
File "C:\Program Files\PsychoPy2\lib\multiprocessing\process.py", line 104, in start
self._popen = Popen(self)
File "C:\Program Files\PsychoPy2\lib\multiprocessing\forking.py", line 239, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:\Program Files\PsychoPy2\lib\multiprocessing\forking.py", line 162, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 224, in dump
self.save(obj)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 419, in save_reduce
save(state)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 419, in save_reduce
save(state)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 725, in save_inst
save(stuff)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 419, in save_reduce
save(state)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Program Files\PsychoPy2\lib\pickle.py", line 306, in save
rv = reduce(self.proto)
ValueError: ctypes objects containing pointers cannot be pickled
答案 0 :(得分:2)
要为您的班级使用pickle
,您需要定义__getstate__
,__setstate__
行为。 More information in docs。
但是(!)据我所知,这不会解决你的实际问题。在这种情况下,您将在MainProcess
内获得ParallelProcess
的新(反序列化)实例,并且无法在父进程的上下文中调用函数。