LINUX.ORG.RU

Как в python передавать и получать значения сопрограммы (корутины) с asyncio?

 ,


0

2

Если взять обычные генераторы, то реализовать подобное просто:

def g():
    yield 1
    # какие-то действия
    yield 2
    # какие-то действия
    yield 3

for result in g():
    print(result)

Плюс, можно через send() отправлять в такой генератор значения, например так:

def g():
    v = 0
    while True:
        v = yield v * 2
        if v > 100:
            break

gen = g()
next(gen)
r = 1
l = []
while True:
    try:
        r = gen.send(r)
        l.append(r)
    except StopIteration:
        break
# l -> [2, 4, 8, 16, 32, 64, 128]

Есть ли возможность так же делать для корутин из нового модуля asyncio?


Ответ на: комментарий от vertinsky

Как вариант.

Вообще, в кишках asyncio (asyncio.tasks.Task) я нашёл, как это делается: корутина превращается в итератор, и потом там идёт обычный next(coro) или coro.send(value). Корутина разбивается на шаги, а потом каждый шаг отправляется в loop: self._loop.call_soon(self._step) Но это как-то неудобно.

memnek
() автор топика
Ответ на: комментарий от memnek

Но это как-то неудобно

ды брось ты! нет ничего удобнее чем «очереди», если речь идёт о нитях (в данном случае корутины — это микронити)

только документауию тебе должны были дать на [asyncio.Queue], а не на queue.Queue :-)

user_id_68054 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.