python - multiprocessing.Process 子类适用于 Linux,但不适用于 Windows

标签 python windows multiprocessing pickle gasp

我正在尝试获取python-gasp在 Windows 上工作,但是当我这样做时 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) 的一个实例( def ),如果有帮助的话。有问题的文件位于 http://bazaar.launchpad.net/~gasp-dev/gasp-core/main/annotate/head%3A/gasp/backend.py

最佳答案

您的 Updater 类有一个成员 screen,它本身有一个成员 process,它接收 multiprocessing.current_process( )

当您调用updater.start()时,它会尝试pickle更新程序。这种情况只发生在 Windows 上,因为 Linux 使用 fork() 而不是 pickling。但是,当前进程对象无法被 pickle 并引发异常。

要解决此问题,您可以删除 process 成员。

关于python - multiprocessing.Process 子类适用于 Linux,但不适用于 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2064533/

相关文章:

python - 使用 joblib 将结果返回给父进程

python - BeautifulSoup:获取文本,创建字典

python - pyqt - 更改 TableView 中的行~单元格颜色

Python 多处理 : Topping off multiprocessing queue before becoming empty

Python multiprocessing.Process 对象的行为就像它持有对另一个进程中的对象的引用。为什么?

python - 使用 python 编写 Ev3 窗口代码

python - 使用 Pexpect 通过命令行将 Python 与 Fortran 连接

python - 如何将多个 seaborn 图保存到同一个 pdf/png 文件?

windows - Git fatal error : remote end hung up

c++ - MSVC6 : Breakpoint stops program