multiprocessing.Process子类在Linux上有效但在Windows上无效

1 投票
1 回答
1273 浏览
提问于 2025-04-15 18:01

我在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.updaterUpdater(multiprocessing.Process)的一个实例(定义),希望这能帮到你。相关的文件可以在这里找到

1 个回答

2

你的 Updater 类里面有一个成员 screen,而这个 screen 里面又有一个成员 process,它的值是通过 multiprocessing.current_process() 获取的。

当你调用 updater.start() 的时候,它会尝试把 updater 进行“序列化”(也就是把它变成一种可以存储或传输的格式)。这种情况只会在 Windows 系统上发生,因为 Linux 系统使用的是 fork() 方法,而不是序列化。不过,当前的进程对象是不能被序列化的,所以就会出现错误。

要解决这个问题,你可以把 process 这个成员去掉。

撰写回答