脚本是否可以启动使用多处理启动其他子进程的进程?

时间:2014-05-27 05:58:37

标签: python-2.7 multiprocessing subprocess pickle traceback

我无法找到这个令人困惑的困境的答案,我想知道它是否是我无法识别的错误的来源。我在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的一个实例,它的可拾取性是什么?如果是这样,有没有办法解决这个问题,而无需完全重新设计系统?

1 个答案:

答案 0 :(得分:1)

您创建孙子进程的唯一限制是您的子进程是以daemon=True开头的。作为multiprocessing.Process.daemon的文档中的状态:

  

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

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