multiprocessing.Process子类在Linux上有效但在Windows上无效
我在Windows上尝试使用python-gasp,但是当我运行import gasp; gasp.begin_graphics()
时,出现了以下错误信息:
File "C:\Python26\lib\site-packages\gasp\backend.py", line 142, in create_screen
screen.updater.start()
File "C:\Python26\lib\multiprocessing\process.py", line 104, in start
self._popen = Popen(self)
File "C:\Python26\lib\multiprocessing\forking.py", line 239, in __init__
dump(process_obj, to_child, HIGHEST_PROTOCOL)
File "C:\Python26\lib\multiprocessing\forking.py", line 162, in dump
ForkingPickler(file, protocol).dump(obj)
File "C:\Python26\lib\pickle.py", line 224, in dump
self.save(obj)
File "C:\Python26\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Python26\lib\pickle.py", line 419, in save_reduce
save(state)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 725, in save_inst
save(stuff)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 649, in save_dict
self._batch_setitems(obj.iteritems())
File "C:\Python26\lib\pickle.py", line 681, in _batch_setitems
save(v)
File "C:\Python26\lib\pickle.py", line 331, in save
self.save_reduce(obj=obj, *rv)
File "C:\Python26\lib\pickle.py", line 396, in save_reduce
save(cls)
File "C:\Python26\lib\pickle.py", line 286, in save
f(self, obj) # Call unbound method with explicit self
File "C:\Python26\lib\pickle.py", line 748, in save_global
(obj, module, name))
PicklingError: Can't pickle <class 'multiprocessing.process._MainProcess'>: it's not found as multiprocessing.process._MainProcess
有人知道为什么我在Windows XP上会遇到这个错误,而在Ubuntu Linux 9.04上却没有吗?
看起来screen.updater
是Updater(multiprocessing.Process)
的一个实例(定义),希望这能帮到你。相关的文件可以在这里找到。
1 个回答
2
你的 Updater
类里面有一个成员 screen
,而这个 screen
里面又有一个成员 process
,它的值是通过 multiprocessing.current_process()
获取的。
当你调用 updater.start()
的时候,它会尝试把 updater 进行“序列化”(也就是把它变成一种可以存储或传输的格式)。这种情况只会在 Windows 系统上发生,因为 Linux 系统使用的是 fork()
方法,而不是序列化。不过,当前的进程对象是不能被序列化的,所以就会出现错误。
要解决这个问题,你可以把 process
这个成员去掉。