import multiprocessing as mp from time import sleep def read_thread_func(queue, num_writers): threads_closed = 0 while threads_closed < num_writers: message = queue.get(block=True, timeout=60) if message == "[THREAD_CLOSING]": threads_closed += 1 else: print(message) def write_thread_func(queue, pid): try: for i in range(5): sleep(1) queue.put("iterating pid = {}, i = {}\n".format(pid, i)) finally: queue.put("[THREAD_CLOSING]") if __name__ == '__main__': manager = mp.Manager() pool = mp.Pool(mp.cpu_count()) results = [] # num write threads per read thread num_write_threads = 4 # here we make multiple write thread/read thread groups # in quick succession for queue in range(3): queue = manager.Queue() # if we uncomment this line we avoid the crash #sleep(0.5) results.append(pool.apply_async(read_thread_func, args=[queue, num_write_threads])) for i in range(num_write_threads): results.append(pool.apply_async(write_thread_func, args=[queue, i])) pool.close() pool.join() # print possible exceptions for result in results: print(result.get())