脚本可以启动一个进程,该进程可以使用Multiprocessing启动其他子进程吗?



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

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

Traceback (most recent call last):
  File "C:UsersDavidDesktopPysplitmultiverse.py", line 141, in multiButtonPress
    self.universeList[0].start()
  File "C:Python27libmultiprocessingprocess.py", line 130, in start
    self._popen = Popen(self)
  File "C:Python27libmultiprocessingforking.py", line 277, in __init__
    dump(process_obj, to_child, HIGHEST_PROTOCOL)
  File "C:Python27libmultiprocessingforking.py", line 199, in dump
    ForkingPickler(file, protocol).dump(obj)
  File "C:Python27libpickle.py", line 224, in dump
    self.save(obj)
  File "C:Python27libpickle.py", line 331, in save
    self.save_reduce(obj=obj, *rv)
  File "C:Python27libpickle.py", line 419, in save_reduce
    save(state)
  File "C:Python27libpickle.py", line 286, in save
    f(self, obj) # Call unbound method with explicit self
  File "C:Python27libpickle.py", line 649, in save_dict
    self._batch_setitems(obj.iteritems())
  File "C:Python27libpickle.py", line 681, in _batch_setitems
    save(v)
  File "C:Python27libpickle.py", line 306, in save
    rv = reduce(self.proto)
  File "C:Python27libmultiprocessingmanagers.py", line 484, in __reduce__
    return type(self).from_address, 
AttributeError: type object 'SyncManager' has no attribute 'from_address'
SyncManager是在multiprocessing库中找到的一个类。我的子进程包含一个对象,该对象是Process的一个实例,与它的可pickle性混淆吗?如果是这样,有没有办法在不完全重新设计系统的情况下解决这个问题?

创建孙子进程的唯一限制是子进程是否以daemon=True启动。multiprocessing.Process.daemon:

文档中的As状态

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

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

最新更新