Я пытался создать версию питона асинхронной из в Java CountDownLatch
Почему condition.notify_all пробуждает только одного официанта?
class CountDownLatch:
def __init__(self, count=1):
if count == 0:
raise ValueError('count should be more than zero')
self.count = count
self.countdown_over = aio.Condition()
async def countdown(self):
with await self.countdown_over:
print('decrementing counter')
self.count -= 1
print('count {}'.format(self.count))
if self.count == 0:
print('count is zero no more waiting')
await aio.sleep(1)
self.countdown_over.notify_all()
async def wait(self):
with await self.countdown_over:
await self.countdown_over.wait()
Теперь я пытаюсь его.
In [2]: async def g(latch):
...: await latch.wait()
...: print('g')
...:
In [3]: async def f(latch):
...: print('counting down')
...: await latch.countdown()
...: await g(latch)
...:
In [4]: def run():
...: latch = CountDownLatch(2)
...: loop = aio.get_event_loop()
...: loop.run_until_complete(aio.wait((f(latch), f(latch))))
...:
In [5]: import asyncio as aio
In [6]: from new.tests.test_turnovers import CountDownLatch
А вот выходного
counting down
decrementing counter
count 1
counting down
decrementing counter
count 0
count is zero no more waiting
g
Я не могу понять, что я делаю неправильно здесь. Счетчик создается и уменьшается просто отлично. Одна сопрограмма даже уведомляется и выполняет свою задачу, но вторая не по какой-то причине.