gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:51:55 24 4
gpt4 key购买 nike

我在多处理方面遇到了一些麻烦。这是我的程序的基本方案:

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

    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

最佳答案

要在您的类中使用 pickle,您需要定义 __getstate____setstate__ 行为。 More information in docs

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

关于Python-并行进程调用主进程函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13951172/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com