pythonwindowsmultiprocessingpicklegasp

multiprocessing.Process subclass works on Linux but not Windows


I'm trying to get python-gasp working on Windows, but when I do import gasp; gasp.begin_graphics() I get the following traceback:

  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

Any idea why I'm getting this error on Windows XP but not on Ubuntu Linux 9.04?

It looks like screen.updater is an instance of Updater(multiprocessing.Process) (def), if that helps. The file in question is at http://bazaar.launchpad.net/~gasp-dev/gasp-core/main/annotate/head%3A/gasp/backend.py


Solution

  • Your Updater class has a member screen, which itself has a member process which receives the value of multiprocessing.current_process().

    When you call updater.start(), it tries to pickle the updater. This only happens on Windows because Linux uses fork() instead of pickling. However, the current-process object cannot be pickled and the exception is raised.

    To fix this, you can remove the process member.