【问题标题】:Can a script start a process that starts other child processes using Multiprocessing?脚本可以启动一个使用多处理启动其他子进程的进程吗?
【发布时间】:2014-05-27 05:58:37
【问题描述】:

我无法找到这个令人困惑的困境的答案,我想知道这是否是我无法识别的错误的根源。我在 64 位 Windows 7 上运行,我目前正在编写一个游戏,其中主进程应该能够使用 Multiprocessing 模块生成多个进程。然后,这些子进程中的每一个都会生成一个额外的进程,该进程使用多处理模块运行图形库。

当我尝试运行脚本(从 IDLE 和通过命令提示符运行文件)时,我得到一个回溯,内容如下:

Traceback (most recent call last):
  File "C:\Users\David\Desktop\Py\split\multiverse.py", line 141, in multiButtonPress
    self.universeList[0].start()
  File "C:\Python27\lib\multiprocessing\process.py", line 130, in start
    self._popen = Popen(self)
  File "C:\Python27\lib\multiprocessing\forking.py", line 277, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:\Python27\lib\multiprocessing\forking.py", line 199, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:\Python27\lib\pickle.py", line 224, in dump
    self.save(obj)
  File "C:\Python27\lib\pickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:\Python27\lib\pickle.py", line 419, in save_reduce
    save(state)
  File "C:\Python27\lib\pickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:\Python27\lib\pickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:\Python27\lib\pickle.py", line 681, in _batch_setitems
    save(v)
  File "C:\Python27\lib\pickle.py", line 306, in save
    rv = reduce(self.proto)
  File "C:\Python27\lib\multiprocessing\managers.py", line 484, in __reduce__
    return type(self).from_address, \
AttributeError: type object 'SyncManager' has no attribute 'from_address'

SyncManager 是多处理库中的一个类。我的子流程是否包含一个对象,该对象是 Process 的一个实例,它的可取性被弄乱了?如果是这样,有没有办法在不必完全重新设计系统的情况下解决这个问题?

【问题讨论】:

标签: python-2.7 multiprocessing subprocess pickle traceback


【解决方案1】:

创建孙进程的唯一限制是您的子进程是否以daemon=True 启动。正如multiprocessing.Process.daemon 的文档中所述:

请注意,不允许守护进程创建子进程。 否则,如果一个守护进程会使其子进程成为孤儿 当其父进程退出时终止。此外,这些是 不是 Unix 守护进程或服务,它们是正常的进程 如果非守护进程已退出,则终止(并且未加入)。

只要在proc.start() 之前执行proc.daemon = False,就可以在proc 中创建孙进程。您看到的错误与尝试将不可腌制对象 (multiprocessing.SyncManager) 传递给您的子进程有关。这是一个单独的问题,如果您需要帮助,您应该发布一个新问题。

【讨论】:

  • 看,这让我很困惑,我不相信我已经在我的任何代码中创建了 SyncManager 实例。我假设,因为它也是多处理库的一部分,所以它是进程的一个组件?
  • 您是否创建了multiprocessing.Manager?那是SyncManager的孩子
  • 哎呀!我没有意识到 SyncManager 是 Manager 的子类。不知道为什么那个从我身边溜走。感谢您的帮助!
猜你喜欢
  • 2010-10-25
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 1970-01-01
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多