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