<div dir="ltr"> > Что выбрать? <div><br></div><div>C++ / C# / Java</div><div><br></div><div>Multithreading в питоне - это недоразумение</div><div><a href="https://wiki.python.org/moin/GlobalInterpreterLock">https://wiki.python.org/moin/GlobalInterpreterLock</a><br></div><div> <br clear="all"><div><div dir="ltr" class="gmail_signature">--<br>Best regards,<br>Mykola</div></div></div><div><div dir="ltr" class="gmail_signature" data-smartmail="gmail_signature"><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 12, 2021 at 6:55 PM Volodymyr Litovka <doka@xlit.one> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<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 cols="72">--
Volodymyr Litovka
"Vision without Execution is Hallucination." -- Thomas Edison</pre>
</div>
_______________________________________________<br>
uanog mailing list<br>
<a href="mailto:uanog@uanog.kiev.ua" target="_blank">uanog@uanog.kiev.ua</a><br>
<a href="https://mailman.uanog.kiev.ua/mailman/listinfo/uanog" rel="noreferrer" target="_blank">https://mailman.uanog.kiev.ua/mailman/listinfo/uanog</a></blockquote></div>