我一直无法找到这个令人困惑的困境的答案,我想知道这是否是我无法识别的错误的来源。我在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:
请注意,守护进程不允许创建子进程。否则,一个守护进程将使它的孩子成为孤儿在其父进程退出时终止。此外,还有不是Unix守护进程或服务,它们是正常的进程如果非守护进程已退出,则终止(且未加入)。
只要您在proc.start()
之前执行proc.daemon = False
,您将能够在proc
中创建孙子进程。您看到的错误与试图将不可pickle对象(multiprocessing.SyncManager
)传递给子进程有关。这是一个单独的问题,如果你需要帮助,你应该发布一个新的问题。