Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 27, 2019 21:43:19

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  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)))

Как я понимаю, каждый корутин представляет собой сопрограмму, которая выполняется независимо. Таким образом я планировал получать суммы вперемешку(потому что в первой корутине задержка составляет 2 сек, а во втором - 0.4)

Проблема в том, что консоль выводит результат синхронно:
g1: 1
g2: 1
g1: 2
g2: 2
g1: 3
g2: 3
g1: 4
g2: 4
g1: 5
g2: 5

Офлайн

#2 Фев. 27, 2019 22:36:00

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Помогают ли корутины асинхронности?

Ваш короутин не короутин
https://docs.python.org/3/library/asyncio.html



Офлайн

#3 Фев. 27, 2019 22:58:01

zlodiak
От: Россия
Зарегистрирован: 2014-01-19
Сообщения: 159
Репутация: +  0  -
Профиль   Адрес электронной почты  

Помогают ли корутины асинхронности?

doza_and
Ваш короутин не короутинhttps://docs.python.org/3/library/asyncio.html
Я правильно понял, что сейчас корутины, в том виде в котором их записал я, не используются, а используется пакет asincio?

Офлайн

#4 Фев. 28, 2019 04:48:06

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Помогают ли корутины асинхронности?

zlodiak
Как я понимаю, каждый корутин представляет собой сопрограмму, которая выполняется независимо.
Вот тут надо поподробнее, что значит “независимо”? Если у меня один процессор с одним ядром, то в момент времени может выполняться только одна инструкция. Вы можете получить псевдопараллельность быстро-быстро переключаясь между разными задачами. Это реализуется процессами или потоками, и корутины тут не по делу. Корутины всегда выполняются последовательно, но есть один прикол - если у вас в программе есть обращение к внешнему ресурсу (к файловой системе, к сети, к какому-то устройству), то этот вызов можно сделать двумя способами: заблокировав поток или без блокировки. Первый случай ничем не отличается от выполнения любого другого последовательного кода, а вот если вы используете неблокирующие системные вызовы, то в то время, когда некая функция ждет ответа на свой вызов (откуда-то извне), можно передать управление другой функции. Вот тут отлично работают асинхронные корутины. Их можно реализовать через генераторы, можно как-то иначе. Это не суть, главное тут - асинхронные операции (запросы к БД, к веб-сервису, чтение/запись файла и пр.), без них нет смысла писать асинхронный код. При этом не надо путать понятия, генератор (то есть функция с yield) не обязательно занимается асинхронщиной, у него много дугих применений.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version