Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 28, 2017 15:17:38

zip1982b
Зарегистрирован: 2014-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

Здравствуйте уважаемые форумчане, разъясните пожалуйста пример из документации. Есть вот такой код:

 import asyncio
async def compute(x, y):
    print("Compute %s + %s ..." % (x, y))
    await asyncio.sleep(1.0)
    return x + y
async def print_sum(x, y):
    result = await compute(x, y)
    print("%s + %s = %s" % (x, y, result))
loop = asyncio.get_event_loop()
loop.run_until_complete(print_sum(1, 2))
loop.close()
На картинке изображена диаграмма запуска сопрограмм. Так вот во всех примерах из документации встречается asyncio.sleep(секунды) для того чтобы мол показать трудоёмкие вычисления. И во время исполнения asyncio.sleep() управление переходит Задаче, а потом и Циклу событий (судя по диаграмме). Так вот вопрос. Если в сопрограмме compute() не использовать asyncio.sleep() а например действительно вычисления длительные по времени, то управление не перейдёт Циклу событий, а будет исполняться до вычисления результата, по сути это будет блокирующий код? И как я понял, функция sleep от asyncio это какая то хитрая функция исполняемая Циклом событий? Что то в доках я ясного ответа не нашёл.

Прикреплённый файлы:
attachment asyncio.png (51,4 KБ)

Офлайн

#2 Апрель 28, 2017 15:21:34

zip1982b
Зарегистрирован: 2014-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

блин нечаянно поместил вопрос в раздел “для экспертов”

Офлайн

#3 Апрель 28, 2017 17:34:48

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

zip1982b
для того чтобы мол показать трудоёмкие вычисления
неверно, не трудоемкие, а имеющие операции ввода/вывода - по сути когда процесс простаивает ожидая ответ. В случае трудоемких задач асинхронность плавно перетекает в синхронность т.е. никаких переключений на другие задачи в этом смысле не будет.
asyncio.sleep используется исключительно для эмуляции IO издержек, возьмите обычный time.sleep и сэмитируете блокирующие переключения вычисления.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#4 Апрель 28, 2017 18:06:38

zip1982b
Зарегистрирован: 2014-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

то есть по сути, сопрограмма compute() должна быть future объектом в случае I\O?
Получается что только в операциях I\O может быть возврат управления Циклу событий, чтобы он мог запустить другие задачи?
по поводу asyncio.sleep() в документашке нашёл что создаётся внутренний (я так понимаю, скрытый от нас) future который использует call_later() для того чтобы разбудить задачу.

Офлайн

#5 Апрель 29, 2017 10:02:16

JOHN_16
От: Россия, Петропавловск-Камчатск
Зарегистрирован: 2010-03-22
Сообщения: 3292
Репутация: +  221  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

zip1982b
Получается что только в операциях I\O может быть возврат управления Циклу событий, чтобы он мог запустить другие задачи?
Да. Главное Вам уяснить что асинхронность это не про тяжелые задачи - это пожалуй самая частая ошибка в понимании этой технологии.



_________________________________________________________________________________
полезный блог о python john16blog.blogspot.com

Офлайн

#6 Апрель 29, 2017 20:28:28

zip1982b
Зарегистрирован: 2014-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

На предприятии имеются контроллеры в количестве 230 штук. Они поддерживают свой протокол (фирменный) поверх tcp\ip и слушают порт 4545. На них (контроллерах) реализован сервер этого протокола. После отправки разрешения на соединение и получения от контроллера подтверждения что соединение установлено (фирм протокол), мне необходимо подписаться (предусмотрено фирменным протоколом) на определённые события которые могут произойти в контроллере. И если эти события происходят, то контроллер отсылает инфу о событии. Так вот эти события и необходимо принять на моём компьютере клиенте. До asyncio, при использовании мной обычного кода клиент как бы зависал. После этого я начал смотреть в сторону asyncio. Скажите JOHN_16 данная задача входит в разряд I\O? И должна решаться методами асинхронного программирования? На мой взгляд, да. При том, что я хочу чтобы был один клиент (компьютер производящий анализ) и много контроллеров - серверов отсылающих данные по событию. По обработке данных пришедших от серверов, там тяжёлых задач (имеющих длительные вычисления и блокирующих код) не предвидится. Возможно в будущем необходимо будет заносить определённые данные в БД. Как то так.
JOHN_16 я благодарен за ваши поправки и ответы.

Отредактировано zip1982b (Апрель 29, 2017 20:31:57)

Офлайн

#7 Апрель 30, 2017 11:55:13

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2679
Репутация: +  182  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

> На предприятии имеются контроллеры в количестве 230 штук.

Потоки не пробовал?



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#8 Апрель 30, 2017 12:41:19

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

Блокирующий или не блокирующий код в asyncio?

Rodegast
Потоки не пробовал?
Я бы у ТС уточнил, планируется увеличение количества машин? 230 это уже довольно много потоков. Может памяти не хватить на слабенькой машине.
Еще вопрос насколько часто возникают события и сколько времени требует обработка.
zip1982b
серверов отсылающих данные
По терминологии. Если контроллеры активно шлют забросы на обработку данных то по отношению к вашей системе они клиенты а не сервера а ваш центральный комп сервер а не клиент.



Отредактировано doza_and (Апрель 30, 2017 12:43:42)

Офлайн

#9 Апрель 30, 2017 14:08:06

zip1982b
Зарегистрирован: 2014-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

С потоками много проблем (GIL). Хотя это не мои мысли (читаю блог Светлова).

Я бы у ТС уточнил, планируется увеличение количества машин?
Да, со временем планируется, когда достроят новые цеха.
По терминологии. Если контроллеры активно шлют забросы на обработку данных то по отношению к вашей системе они клиенты а не сервера а ваш центральный комп сервер а не клиент.
Может Вы и правы, но в описании к протоколу (Open Protocol фирмы Atlas Copco) сказано обратное (смотреть рисунок). Дело в том что протокол предусматривает довольно обширные возможности для управления контроллером. Можно работать с ним в режиме спросил, получил ответ (тут чисто клиент - серверное взаимодействие), а можно установил с ним соединение (методами протокола) и подписался на оповещение в случае определённых событий (событий тоже может быть несколько). В случае когда линия сборки работает, то события происходят часто (пример: Неудачно выполнена затяжка болтового соединения или оператор просканировал вин номер на кузове автомобиля - необходимо получит этот вин номер, проанализировать его и указать контроллеру какую программу выбрать для данного типа авто). В случае когда линия стоит (перерыв или пересменка) появление событий может достигать значительного времени (20-30 минут).
Контроллер может одновременно поддерживать связь с пятью клиентами, я уже подумывал, чтобы для одних задач поставить один компьютер с программой, а для других задач (сохранение результатов в БД) другой комп.

Прикреплённый файлы:
attachment Снимок2.PNG (184,4 KБ)

Офлайн

#10 Апрель 30, 2017 14:18:05

zip1982b
Зарегистрирован: 2014-11-08
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Блокирующий или не блокирующий код в asyncio?

asyncio начал изучать недавно и думаю что реальные задачи будут способствовать лучшему освоению и пониманию асинхронного программирования. Хотя не раз убеждаюсь, что не стоит держаться за определённые технологии, необходимо отталкиваться от потребностей. Это так мысли в слух.

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version