Issue 28422: multiprocessing Manager mutable type member access failure (original) (raw)
Accessing some Manager types (e.g. Lock) through a list, dict or Namespace proxy is not possible if both the mutable container (e.g. list) and contained type instance (e.g. Lock) have been created in the same process.
Symptoms:
In accessing process: multiprocessing.managers.RemoteError on access, e.g.: Unserializable message: ('#RETURN', <thread.lock object at 0x7fcf40d31370>)
.. and in underlying manager: _pickle.PicklingError: Can't pickle <class '_thread.lock'>: attribute lookup lock on _thread failed
The provided test script performs: 0) Initialise SyncManager (via multiprocessing.Manager())
- Create list proxy through manager
- Insert another proxied type into the list (e.g. Lock)
- Try to access type instance from (2) via container created in (1)
Note: When step (2) is run in a child process, everything work as expected. When all steps execute in the same process, one gets the aforementioned exception.
See also: https://mail.python.org/pipermail/python-list/2009-September/552988.html
If you un-comment the print_exc() call, you'll see that it still fails - for queue.Queue: