(Фактически это упражнение). Написать две сопрограммы — sender(queue, pattern) и reader(queue, number), которые работают так:
sender(queue, pattern) складывает в объект queue типа asyncio-queue.html все строки из последовательности pattern (гарантируется, что pattern — это последовательность строк). Когда последовательность заканчивается, sender ставит в очередь None и завершается
reader(queue, number) читает из очереди все объекты до тех пор, пока там не встретится number объектов None (это будет означать, что все sender-ы отработали). reader() должен возвращать объект типа Counter, в котором подсчитано количество вхождений всех строк из очереди (но не None).
1 import asyncio
2 import string
3
4 async def main(n):
5 queue = asyncio.Queue(4)
6 alp = string.ascii_lowercase
7 senders = [sender(queue, alp[len(alp) * i // n: len(alp) * (i + 1) // n]) for i in range(n)]
8 res = await asyncio.gather(reader(queue, n), *senders)
9 print(", ".join(f"{key}:{val}" for key, val in sorted(res[0].items())))
10 asyncio.run(main(6))
- На всякий случай напомню, что одна строка — это тоже последовательность строк (единичной длины)
a:1, b:1, c:1, d:1, e:1, f:1, g:1, h:1, i:1, j:1, k:1, l:1, m:1, n:1, o:1, p:1, q:1, r:1, s:1, t:1, u:1, v:1, w:1, x:1, y:1, z:1