Есть примерно такой код.
import queue, threading
def test(q):
time.sleep(4)
c = q.get()
print('thread2 - got {}'.format(c))
q.task_done()
print('thread2 - sending bar')
q.put("bar")
q.join()
print('thread2 - done')
shared_queue = queue.Queue()
t = threading.Thread(target=test, args=(shared_queue, ))
t.start()
print('thread1 - sending foo')
shared_queue.put("foo")
shared_queue.join()
print('thread1 - got {}'.format(shared_queue.get()))
shared_queue.task_done()
t.join()
Т.е. в основном потоке помещаем сообщение в очередь и блокируем его, пока во втором потоке сообщение не достанут и не пометят, как обработанное и тоже самое, но наоборот. Проблема в том, что в большинстве случаев между task_done и помещением сообщения во втором потока, не происходит разблокировки основного потока. Если же сделать небольшую задержку (например, time.sleep), после task_done во втором потоке, то всё выполняется, как и ожидалось.
Вопрос: этого принципиально нельзя избежать, кроме как таким способом, использованием multiprocessing.JoinableQueue или ещё как?