<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>