我无法找到这个令人困惑的困境的答案,我想知道它是否是我无法识别的错误的来源。我在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的一个实例,它的可拾取性是什么?如果是这样,有没有办法解决这个问题,而无需完全重新设计系统?
答案 0 :(得分:1)
您创建孙子进程的唯一限制是您的子进程是以daemon=True
开头的。作为multiprocessing.Process.daemon的文档中的状态:
请注意,不允许守护进程创建子进程。 否则,守护进程会使其子女成为孤儿 当父进程退出时终止。另外,这些是 不是Unix守护进程或服务,它们是正常的进程 如果非守护进程已退出,则终止(并且不加入)。
只要您在proc.daemon = False
之前执行proc.start()
,您就可以在proc
中创建孙子进程。您看到的错误与尝试将不可选对象(multiprocessing.SyncManager
)传递给子进程有关。这是一个单独的问题,如果您需要帮助,您应该发布一个新问题。