[uanog] Parallel processing - which one to use?

Volodymyr Litovka doka at xlit.one
Wed Jan 13 09:18:57 EET 2021


> On 13 Jan 2021, at 09:11, Mykola Ulianytskyi <lystor at gmail.com> wrote:
> 
>> а какая разумная альтернатива?
> 
> Redis

Мнэээ... Ну да, один из вариантов :-)

> 
> --
> Best regards,
> Mykola
> 
> --
> Best regards,
> Mykola
> 
> 
>> On Tue, Jan 12, 2021 at 10:47 PM Volodymyr Litovka <doka at xlit.one> wrote:
>> 
>> Привет,
>> 
>> On 12.01.2021 19:12, Vladimir Sharun wrote:
>> 
>> Постановка задачи требует уточнений. Надо понимать:
>> 
>> на каждый 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
>> 
>> реально - это практически всё как в оригинале, логика простая и прямолинейная, потому ...
>> 
>> какой поток 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>:
>> 
>> Привет,
>> а как правильно подойти к следующей задаче?
>> Есть приложение (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 - три отдельных приложения
>> 
>> тут более-менее понятно - система сама будет распределять CPU resources между приложениями по требованию + внешняя синхронизация
>> но выглядит оно эскадрой пушечных парусников из книжки по истории ;-)
>> 
>> multithreading - три треда в одном приложении, это уже более "модно и молодежно" (хотя задача синхронизации событий остается), но:
>> 
>> гарантируется ли своевременная передача исполнения треду с TCP listener upon packet arrival в услових интенсивной работы треда, обслуживающего UDP?
>> я читал/слышал, что у Питона сложная история отношений с multi-threading, не наступить бы еще тут на грабли
>> 
>> python asyncio
>> 
>> это удобно - одно приложение, никакой синхронизации событий между автономными процессами
>> но вообще это эффективно для такой задачи?
>> 
>> Что выбрать? Какие еще варианты подхода к снаряду могут быть? Как вообще правильно это делать?
>> Спасибо!
>> 
>> --
>> Volodymyr Litovka
>>  "Vision without Execution is Hallucination." -- Thomas Edison
>> 
>> _______________________________________________
>> uanog mailing list
>> uanog at uanog.kiev.ua
>> https://mailman.uanog.kiev.ua/mailman/listinfo/uanog
>> 
>> --
>> Volodymyr Litovka
>>  "Vision without Execution is Hallucination." -- Thomas Edison
>> 
>> _______________________________________________
>> uanog mailing list
>> uanog at uanog.kiev.ua
>> https://mailman.uanog.kiev.ua/mailman/listinfo/uanog


More information about the uanog mailing list