Python - 并行进程调用主进程函数

时间:2012-12-19 11:15:04

标签: python concurrency multiprocessing

我遇到了多处理方面的麻烦。这是我的计划的基本方案:

  • 主要流程
  • 从主进程调用的并行进程
  • 尝试从主进程调用函数的并行进程

    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

1 个答案:

答案 0 :(得分:2)

要为您的班级使用pickle,您需要定义__getstate____setstate__行为。 More information in docs

但是(!)据我所知,这不会解决你的实际问题。在这种情况下,您将在MainProcess内获得ParallelProcess的新(反序列化)实例,并且无法在父进程的上下文中调用函数。

相关问题