[uanog] Parallel processing - which one to use?

Volodymyr Litovka doka at xlit.one
Tue Jan 12 18:55:09 EET 2021


Привет,

а как правильно подойти к следующей задаче?

Есть приложение (e.g. MyApp), которое обрабатывает данные из нескольких 
источников:

             +-----------+
             |  REST API |
             +--+-----+--+
                |     |
     PUSH (TCP) |     | GET (HTTP)
                |     |
                v     v
            +---+-----+---+
    UDP     |             |   Output
  --------->+   MyApp     +----------->
            |             |
            +-------------+

Поток UDP довольно мощный и является источником RAW data. Для обработки 
этих данных нужна дополнительная информация, хранящяяся в SQL - она 
доступа по REST API, а обновления - по TCP PUSH NFYs

Для снижения нагрузки на REST и увеличения собственного быстродействия, 
при старте MyApp наполняет in-ram cache, запрашивая стартовые данные из 
REST API и больше никогда к нему не обращаясь, а обновления приходят по 
TCP (PUSH NFYs)

Таким образом, в процессе работы приложения всегда есть два параллельных 
процесса, один из которых довольно ёмкий либо по времени, либо по ресурсам -

1) старт - приложение долго тянет базу из REST API, реагируя при этом на 
периодические TCP PUSH NFYs (тут можно разбить вытягивание большого 
объема данных на более мелкие чанки)
2) основной цикл работы - приложение слушает очень интенсивный поток UDP 
(я бы сказал, что делает это без пауз на передохнуть), реагируя при этом 
на периодические TCP PUSH NFYs

Пока что это пишется на Питоне, что вносит определенные ограничения в 
набор механизмов. Три варианта, какие я вижу:

  * multiprocess - три отдельных приложения
      o тут более-менее понятно - система сама будет распределять CPU
        resources между приложениями по требованию + внешняя синхронизация
      o но выглядит оно эскадрой пушечных парусников из книжки по
        истории ;-)
  * multithreading - три треда в одном приложении, это уже более "модно
    и молодежно" (хотя задача синхронизации событий остается), но:
      o гарантируется ли своевременная передача исполнения треду с TCP
        listener upon packet arrival в услових интенсивной работы треда,
        обслуживающего UDP?
      o я читал/слышал, что у Питона сложная история отношений с
        multi-threading, не наступить бы еще тут на грабли
  * python asyncio
      o это удобно - одно приложение, никакой синхронизации событий
        между автономными процессами
      o но вообще это эффективно для такой задачи?

Что выбрать? Какие еще варианты подхода к снаряду могут быть? Как вообще 
правильно это делать?

Спасибо!

-- 
Volodymyr Litovka
   "Vision without Execution is Hallucination." -- Thomas Edison

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.uanog.kiev.ua/pipermail/uanog/attachments/20210112/fec5d8b0/attachment.html>


More information about the uanog mailing list