import logging import multiprocessing import time as time_module def get_dict(): ret = {} for i in range(1000): ret[i] = ','.join(str(j) for j in range(i+100)) return ret class Child(): def __init__(self): print('**** creating queue') self._queue = multiprocessing.Queue() print('**** created queue') self._process = None def __enter__(self): print('**** creating process') self._process = multiprocessing.Process(target=self._run) print('**** starting process') self._process.start() print('**** started process') return self def __exit__(self, *args): if self._process.is_alive(): self._process.terminate() self._process.join() # self._queue.close() # self._queue.join_thread() def _run(self): while True: time_module.sleep(10) def enqueue(self, data): self._queue.put(data) def main(): d = get_dict() #d = {'a':1} multiprocessing.log_to_stderr(logging.DEBUG) with Child() as ch: print('**** starting enqueue') ch.enqueue(d) print('**** done enqueue') print('**** starting sleep') time_module.sleep(5) print('**** done sleep') raise Exception('foo') if __name__ == '__main__': main()