# -*- coding: utf-8 -*- """ Problem: 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', ) .. and in underlying manager: _pickle.PicklingError: Can't pickle : attribute lookup lock on _thread failed See also: https://mail.python.org/pipermail/python-list/2009-September/552988.html """ from __future__ import unicode_literals, print_function from traceback import print_exc from multiprocessing import Manager, Process, Event from multiprocessing.managers import RemoteError def use_manager(obj, type_name, mgr=None, started=None, end=None): if not mgr: mgr = Manager() obj.append(getattr(mgr, type_name)()) print('(use_manager) obj[0]: %s' % obj[0]) if started: started.set() if end: end.wait() def add_type_in_child_process(mgr, type_name): started = Event() end = Event() obj = mgr.list() proc = Process(target=use_manager, args=(obj, type_name), kwargs={'started': started, 'end': end}) proc.start() # wait for child process to populate proxied object with a value started.wait() print('(from child) obj[0]: %s' % obj[0]) end.set() proc.join() def add_type_in_own_process(mgr, type_name): # also affects dict, Queue & namespace obj = mgr.list() use_manager(obj, type_name, mgr=mgr) print('(own) obj[0]: %s' % obj[0]) def main(): mgr = Manager() for type_name in ('list', 'dict', 'Namespace', 'Lock', 'RLock', 'Semaphore', 'BoundedSemaphore', 'Condition', 'Event', 'Queue'): # works add_type_in_child_process(mgr, type_name) # fails with pickling error try: add_type_in_own_process(mgr, type_name) except RemoteError: print('Manager failure (for %s)' % type_name) # print_exc() if __name__ == '__main__': main()