[uanog] Parallel processing - which one to use?

Volodymyr Litovka doka at xlit.one
Tue Jan 12 22:47:24 EET 2021


Привет,

On 12.01.2021 19:12, Vladimir Sharun wrote:

> Постановка задачи требует уточнений. Надо понимать:
>
>  1. на каждый UDP пакет надо принимать решение, основываясь на
>     критериях из кэша/апдейтов_в_пуше ? что это ?
>
каждый пакет - это текстовая строка, состоящая из 4-х полей, по одному 
из которых делается if и есличо, то три других проходят проверки на 
валидность и, дополняясь информацией из local cache, уходят в output

что-то типа

while True:
     data, address = lsock.recvfrom(1024)
     try:
         a, b, c, d = [i.strip()) for i in data.decode().split(',)]
         a = int(a)
         if a == 255:
            if not b.isnumeric():
                continue
            va = memcached.get(b)
            if va:
                IPAddress(c)
                d = int(d)
                # we're here because no exception above
                data = b.decode() + socket.inet_aton(c) + d.from_bytes(2, 'big) + va
                for r in remotes:
                    rsock.send(data, r)	# output UDP
         elif a in [3, 5, 7]:
            # smth else
            ...
     except:
         pass

реально - это практически всё как в оригинале, логика простая и 
прямолинейная, потому ...

>  1. какой поток UDP пакетов/с, размеры, надо как-то парсить? большие ?
>
я (наивно?) полагаю, что несколько тысяч pps питон вытянет на среднем 
железе (у меня нет подобного опыта и отталкиваться не от чего), а потом 
таки да -

> On 12.01.2021 19:19, Mykola Ulianytskyi wrote:
>>   > Что выбрать?
>>
>> C++ / C# / Java
уйти на Java


> Например сразу будь готов к написанию еще с порога системы контроля 
> версии датасета в базе и у тебя в кэше, потому что вот эти "усилители 
> класса А без обратной связи" - часто жертвы самоуверенности (рейс 
> про@бали, дата не так проинтерпретировалась и т.п.) и в базе одно, а 
> делаем другое

была такая мысль, спасибо


> Пока что сходу решение - С++/Асинхрон/воркеры, типичный пример тут - 
> nginx.

ну nginx - это ультра-факин-фотонный звездолет по сравнению с тем, что 
написано выше :)


> Да, и inram cache - это тоже штука в себе.

а какая разумная альтернатива?


>
> /12 січня 2021, 18:55:22, від "Volodymyr Litovka" <doka at xlit.one 
> <mailto:doka at xlit.one>>:/
>
>     Привет,
>     а как правильно подойти к следующей задаче?
>     Есть приложение (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
>
>     _______________________________________________
>     uanog mailing list
>     uanog at uanog.kiev.ua  <mailto:uanog at uanog.kiev.ua>
>     https://mailman.uanog.kiev.ua/mailman/listinfo/uanog  <https://mailman.uanog.kiev.ua/mailman/listinfo/uanog>
>
-- 
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/b1752304/attachment-0001.html>


More information about the uanog mailing list