Форум сайта python.su
0
Помогите пожалуйста разобраться. Допустим есть два источника, отдающих данные с разной скоростью. Допустим мне нужно получать эти данные сразу из обоих источников по мере готовности. Вот я реализовал примитивный пример на основе корутинов.
#!/usr/bin/env python3 import time def gen1(): nums = yield while True: time.sleep(2) nums = yield nums[0] + nums[1] g1 = gen1() g1.send(None) def gen2(): nums = yield while True: time.sleep(0.4) nums = yield nums[0] + nums[1] g2 = gen2() g2.send(None) for i in range(5): print('g1: ', g1.send((1, i))) print('g2: ', g2.send((1, i)))
Офлайн
253
Ваш короутин не короутин
https://docs.python.org/3/library/asyncio.html
Офлайн
0
doza_andЯ правильно понял, что сейчас корутины, в том виде в котором их записал я, не используются, а используется пакет asincio?
Ваш короутин не короутинhttps://docs.python.org/3/library/asyncio.html
Офлайн
568
zlodiakВот тут надо поподробнее, что значит “независимо”? Если у меня один процессор с одним ядром, то в момент времени может выполняться только одна инструкция. Вы можете получить псевдопараллельность быстро-быстро переключаясь между разными задачами. Это реализуется процессами или потоками, и корутины тут не по делу. Корутины всегда выполняются последовательно, но есть один прикол - если у вас в программе есть обращение к внешнему ресурсу (к файловой системе, к сети, к какому-то устройству), то этот вызов можно сделать двумя способами: заблокировав поток или без блокировки. Первый случай ничем не отличается от выполнения любого другого последовательного кода, а вот если вы используете неблокирующие системные вызовы, то в то время, когда некая функция ждет ответа на свой вызов (откуда-то извне), можно передать управление другой функции. Вот тут отлично работают асинхронные корутины. Их можно реализовать через генераторы, можно как-то иначе. Это не суть, главное тут - асинхронные операции (запросы к БД, к веб-сервису, чтение/запись файла и пр.), без них нет смысла писать асинхронный код. При этом не надо путать понятия, генератор (то есть функция с yield) не обязательно занимается асинхронщиной, у него много дугих применений.
Как я понимаю, каждый корутин представляет собой сопрограмму, которая выполняется независимо.
Офлайн