Форум сайта python.su
186
> С потоками много проблем (GIL). Хотя это не мои мысли (читаю блог Светлова).
GIL это немного не о том. Вот тут всё более менее доходчиво написано: https://zenwalker.me/blog/async-python
По идее держать 230 потоков тебе и не надо, попробуй подписаться на события в основном потоке, а обрабатывать их в дочерних.
Офлайн
0
Rodegast статья хорошая, надо обдумать…
Офлайн
253
zip1982bЕще раз подчеркну, перед тем как делать систему надо четко сформулировать задачу.
До asyncio, при использовании мной обычного кода клиент как бы зависал.
Отредактировано doza_and (Май 1, 2017 08:49:01)
Офлайн
0
Вот как вы заметили что он зависал? У вас долго идет обработка????После того как я создавал сокет и устанавливал соединение s.connect((host, port)), необходимо отправить сообщение в котором - запрос на соединение методами Open Protocol-a. Получив ответ от контроллера и проанализировав его (подтверждение на соединение или отказ), я отсылал сообщение в котором подписывался на события. В ответном сообщении от контроллера подтверждалось что клиент подписан на рассылку событий. Далее в коде клиента я просто ждал сообщений (о событиях) от контроллера-сервера. Если события происходили в течении 5 секунд после последнего отправленного сообщения, то я (код клиента) их получал, но если события происходят через 5-10 и более минут, то при возникновении событий на контроллере сообщения не приходят.
Нужен вашей системе GUI или нет?Пока в мыслях - веб интерфейс. Может быть aiohttp, если будет сделан выбор в сторону asyncio.
Офлайн
186
> Если события происходили в течении 5 секунд после последнего отправленного сообщения, то я (код клиента) их получал, но если события происходят через 5-10 и более минут, то при возникновении событий на контроллере сообщения не приходят.
С чего ты взял что оно зависает? Скорей всего тебе через какое-то время необходимо продлять подписку.
Офлайн
0
Скорей всего тебе через какое-то время необходимо продлять подпискуНет, контроллеру необходимо один раз получить запрос на подписку, а далее пока не пришлёшь команду отписаться от подписки на события, он исправно шлёт события. У меня такое ощущение, что происходит разрыв соединения на уровне 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()
Отредактировано zip1982b (Май 1, 2017 20:24:08)
Офлайн
72
zip1982bНадо смотреть описание протокола. Может сервер должен какое-то приветствие выдавать? Кстати, а точно tcp? Обычно события по udp шлют.
После старта программы контроллер получает запрос на соединение, отсылает ответ что соединение установлено и почему то происходит разрыв соединения на уровне TCP? Срабатывает connection_lost() вроде как приходит EOF. Кто знает почему так происходит?
Офлайн
186
> У меня такое ощущение, что происходит разрыв соединения на уровне TCP/IP.
Полностью согласен с PooH надо смотреть описание протокола/драйвера. По идее соединение может закрываться микроконтроллером через какое-то время.
> прочёл статью которую ты присылал, ну и сделал вывод, что мне в данной ситуации необходимо использовать asyncio, так как большую часть времени работы программы будет составлять I\O операции.
Ты её внимательно читал? Основной смысл статьи в том что когда очень большой пул потоков, то из-за больших накладных расходов он не эффективно работает и вот тогда нужно использовать асинхрон. Если ты будешь использовать события, то потоков будет не много.
Офлайн
0
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)
Офлайн