Python 3.6 асинхронно ждут без асинхронности: как написать собственный простейший цикл обработки событий? - PullRequest
0 голосов
/ 17 ноября 2018

Точно так же, как для понимания синтаксиса async await, поэтому я ищу какое-то приложение 'hello world' без использования asyncio вообще.

Так как же создать простейший цикл обработки событий, используя только сам синтаксис Python? Самый простой код (из этой Запустите асинхронную функцию без импорта пакета asyncio , дальнейший код гораздо больше, чем hello world, поэтому я и спрашиваю) выглядит так:

async def cr():
    while(True):
        print(1)

cr().send(None)

Он печатает 1 бесконечно, не так хорошо.

Итак, 1-й вопрос: как вернуться из сопрограммы обратно в основной поток? yield ключевое слово создает асинхронный генератор сопрограмм, а мы не ожидали.

Я также был бы признателен за простое приложение, подобное этому то есть у нас есть сопрограмма, которая печатает 1, затем возвращает цикл обработки событий, затем печатает 2, затем завершает работу с возвратом 3, и простой цикл обработки событий, который выдвигает сопрограмму до возврата и потребляет результат.

1 Ответ

0 голосов
/ 26 ноября 2018

Как насчет этого?

import types

@types.coroutine
def simple_coroutine():
    print(1)
    yield
    print(2)
    return 3

future = simple_coroutine()
while True:
    try: future.send(None)
    except StopIteration as returned:
        print('It has returned', returned.value)
        break

Я думаю, что вашей самой большой проблемой является то, что вы смешиваете понятия.Асинхронная функция не совпадает с сопрограммой.Более уместно думать об этом как о способе сочетания сопрограмм.Как и обычные def функции, это способ объединения операторов в функции.Да, Python является очень рефлексивным языком, поэтому def также является оператором, а то, что вы получаете от своей асинхронной функции, также является сопрограммой - но вам нужно иметь что-то внизу, с чего начать.(Внизу, урожайность - это просто yield ing. На каком-то промежуточном уровне это, конечно, await ing - чего-то еще.) Это дается вам через декоратор types.coroutine в стандартной библиотеке.

Если у вас есть еще вопросы, не стесняйтесь спрашивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...