Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 30, 2017 15:08:48

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

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

> С потоками много проблем (GIL). Хотя это не мои мысли (читаю блог Светлова).
GIL это немного не о том. Вот тут всё более менее доходчиво написано: https://zenwalker.me/blog/async-python

По идее держать 230 потоков тебе и не надо, попробуй подписаться на события в основном потоке, а обрабатывать их в дочерних.



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

Офлайн

#2 Апрель 30, 2017 23:09:22

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

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

Rodegast статья хорошая, надо обдумать…

Офлайн

#3 Май 1, 2017 08:45:27

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

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

zip1982b
До asyncio, при использовании мной обычного кода клиент как бы зависал.
Еще раз подчеркну, перед тем как делать систему надо четко сформулировать задачу.

Вот как вы заметили что он зависал? У вас долго идет обработка????
Основные вопросы:
  • Какая максимальная частота запросов?
  • Сколько времени обрабатывается один запрос?
  • Какая задержка допустима при обработке запроса (допустима потенциально сколь угодно долгая обработка)?
  • Допустима потеря отдельных запросов?
  • Как должна себя вести система при зависании вашего компа?
  • Как должна себя вести система при потерях связи?
  • Все ли запросы имеют одинаковые свойства(приоритет)?
  • Как будет осуществляться старт и останов системы, сколько на это можно потратить времени?
  • Сколько режимов передачи данных будет поддерживать ваша система?
  • Как вы будете разбираться с ошибками (какая система логгирования и отладки)?
  • Нужен вашей системе GUI или нет?

Пока вы не ответите на эти вопросы вообще не может быть речи ни о какой серьезной системе промышленной автоматизации.



Отредактировано doza_and (Май 1, 2017 08:49:01)

Офлайн

#4 Май 1, 2017 13:42:27

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

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

Вот как вы заметили что он зависал? У вас долго идет обработка????
После того как я создавал сокет и устанавливал соединение s.connect((host, port)), необходимо отправить сообщение в котором - запрос на соединение методами Open Protocol-a. Получив ответ от контроллера и проанализировав его (подтверждение на соединение или отказ), я отсылал сообщение в котором подписывался на события. В ответном сообщении от контроллера подтверждалось что клиент подписан на рассылку событий. Далее в коде клиента я просто ждал сообщений (о событиях) от контроллера-сервера. Если события происходили в течении 5 секунд после последнего отправленного сообщения, то я (код клиента) их получал, но если события происходят через 5-10 и более минут, то при возникновении событий на контроллере сообщения не приходят.

По поводу вопросов Вы doza_and абсолютно правы, я сейчас определяюсь с задачами программы.
Нужен вашей системе GUI или нет?
Пока в мыслях - веб интерфейс. Может быть aiohttp, если будет сделан выбор в сторону asyncio.
Вообще тяжёлых вычислений не будет. Будет реализован Open Protocol + чтение конфигурационных файлов. И в случае возникновения событий, смотрим конфиги на данный контроллер (так как у каждого контроллера задачи немного разные) и отсылаем нужную команду.

Офлайн

#5 Май 1, 2017 14:41:22

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

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

> Если события происходили в течении 5 секунд после последнего отправленного сообщения, то я (код клиента) их получал, но если события происходят через 5-10 и более минут, то при возникновении событий на контроллере сообщения не приходят.

С чего ты взял что оно зависает? Скорей всего тебе через какое-то время необходимо продлять подписку.



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

Офлайн

#6 Май 1, 2017 20:23:17

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

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

Скорей всего тебе через какое-то время необходимо продлять подписку
Нет, контроллеру необходимо один раз получить запрос на подписку, а далее пока не пришлёшь команду отписаться от подписки на события, он исправно шлёт события. У меня такое ощущение, что происходит разрыв соединения на уровне TCP/IP. Использовал пример из документации asyncio:
 import asyncio
class OpenProtocolClient(asyncio.Protocol):
    def __init__(self, message, loop):
        self.message = message
        self.loop = loop
    def connection_made(self, transport):
        transport.write(self.message)
        
    def data_received(self, data):
        print('Data received: {!r}'.format(data.decode()))
    def connection_lost(self, exc):
        print('The server closed the connection')
        print('Stop the event loop')
        self.loop.stop()
loop = asyncio.get_event_loop()
message = assemblyMessage('communicationStart') # эта функция ипортируется из другого модуля, не указан в коде
coro = loop.create_connection(lambda: OpenProtocolClient(message, loop),
                              '192.168.0.5', 4545)
loop.run_until_complete(coro)
loop.run_forever()
loop.close()
После старта программы контроллер получает запрос на соединение, отсылает ответ что соединение установлено и почему то происходит разрыв соединения на уровне TCP? Срабатывает connection_lost() вроде как приходит EOF. Кто знает почему так происходит?
Rodegast прочёл статью которую ты присылал, ну и сделал вывод, что мне в данной ситуации необходимо использовать asyncio, так как большую часть времени работы программы будет составлять I\O операции.

Отредактировано zip1982b (Май 1, 2017 20:24:08)

Офлайн

#7 Май 2, 2017 04:36:35

PooH
От:
Зарегистрирован: 2006-12-05
Сообщения: 1948
Репутация: +  72  -
Профиль   Отправить e-mail  

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

zip1982b
После старта программы контроллер получает запрос на соединение, отсылает ответ что соединение установлено и почему то происходит разрыв соединения на уровне TCP? Срабатывает connection_lost() вроде как приходит EOF. Кто знает почему так происходит?
Надо смотреть описание протокола. Может сервер должен какое-то приветствие выдавать? Кстати, а точно tcp? Обычно события по udp шлют.



Вот здесь один из первых отарков съел лаборанта. Это был такой умный отарк, что понимал даже теорию относительности. Он разговаривал с лаборантом, а потом бросился на него и загрыз…

Офлайн

#8 Май 2, 2017 10:58:28

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

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

> У меня такое ощущение, что происходит разрыв соединения на уровне TCP/IP.

Полностью согласен с PooH надо смотреть описание протокола/драйвера. По идее соединение может закрываться микроконтроллером через какое-то время.

> прочёл статью которую ты присылал, ну и сделал вывод, что мне в данной ситуации необходимо использовать asyncio, так как большую часть времени работы программы будет составлять I\O операции.

Ты её внимательно читал? Основной смысл статьи в том что когда очень большой пул потоков, то из-за больших накладных расходов он не эффективно работает и вот тогда нужно использовать асинхрон. Если ты будешь использовать события, то потоков будет не много.



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

Офлайн

#9 Май 2, 2017 14:39:45

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

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

Rodegast Ты абсолютно прав! Решил прочесть описание протокола до конца
вот что нашёл в описании:
Keep alive message
MID 9999 Keep alive message The integrator sends a keep alive to the controller. The controller should only mirror and return the received keep alive to the integrator.
The controller has a communication timeout equal to 15s. This means that if no message has been exchanged between the integrator and the controller for the last 15s, then the controller considers the connection lost and closes it. In order to keep the communication alive the integrator must send a keep alive to the controller with a time interval lower than 15s. Note: An inactivity timeout is suggested to integrator i.e. if no message has been exchanged (sent or received) during the last 10s, send a keep alive.
Теперь понятно когда я писал обычный код (без использования asyncio) и ждал возникновение событий больше 15 секунд, связь обрывалась на уровне Open Protocola.
Теперь ещё раз внимательно проштудирую описание Open Protocola, определюсь с задачами моего приложения и приступлю к анализу какую технологию использовать (на базе asyncio или потоков).

Отредактировано zip1982b (Май 2, 2017 15:32:38)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version