<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<p>Привет,</p>
<p>а как правильно подойти к следующей задаче?</p>
<p>Есть приложение (e.g. MyApp), которое обрабатывает данные из
нескольких источников:</p>
<pre> +-----------+
| REST API |
+--+-----+--+
| |
PUSH (TCP) | | GET (HTTP)
| |
v v
+---+-----+---+
UDP | | Output
--------->+ MyApp +----------->
| |
+-------------+
</pre>
<p>Поток UDP довольно мощный и является источником RAW data. Для
обработки этих данных нужна дополнительная информация, хранящяяся
в SQL - она доступа по REST API, а обновления - по TCP PUSH NFYs<br>
</p>
<p>Для снижения нагрузки на REST и увеличения собственного
быстродействия, при старте MyApp наполняет in-ram cache,
запрашивая стартовые данные из REST API и больше никогда к нему не
обращаясь, а обновления приходят по TCP (PUSH NFYs)</p>
<p>Таким образом, в процессе работы приложения всегда есть два
параллельных процесса, один из которых довольно ёмкий либо по
времени, либо по ресурсам -<br>
</p>
<p>1) старт - приложение долго тянет базу из REST API, реагируя при
этом на периодические TCP PUSH NFYs (тут можно разбить вытягивание
большого объема данных на более мелкие чанки)<br>
2) основной цикл работы - приложение слушает очень интенсивный
поток UDP (я бы сказал, что делает это без пауз на передохнуть),
реагируя при этом на периодические TCP PUSH NFYs</p>
<p>Пока что это пишется на Питоне, что вносит определенные
ограничения в набор механизмов. Три варианта, какие я вижу:</p>
<ul>
<li>multiprocess - три отдельных приложения</li>
<ul>
<li>тут более-менее понятно - система сама будет распределять
CPU resources между приложениями по требованию + внешняя
синхронизация</li>
<li>но выглядит оно эскадрой пушечных парусников из книжки по
истории ;-)<br>
</li>
</ul>
<li>multithreading - три треда в одном приложении, это уже более
"модно и молодежно" (хотя задача синхронизации событий
остается), но:</li>
<ul>
<li>гарантируется ли своевременная передача исполнения треду с
TCP listener upon packet arrival в услових интенсивной работы
треда, обслуживающего UDP?</li>
<li>я читал/слышал, что у Питона сложная история отношений с
multi-threading, не наступить бы еще тут на грабли<br>
</li>
</ul>
<li>python asyncio</li>
<ul>
<li>это удобно - одно приложение, никакой синхронизации событий
между автономными процессами</li>
<li>но вообще это эффективно для такой задачи?<br>
</li>
</ul>
</ul>
Что выбрать? Какие еще варианты подхода к снаряду могут быть? Как
вообще правильно это делать?<br>
<p>Спасибо!<br>
</p>
<pre class="moz-signature" cols="72">--
Volodymyr Litovka
"Vision without Execution is Hallucination." -- Thomas Edison</pre>
</body>
</html>