[uanog] Parallel processing - which one to use?
Volodymyr Litovka
doka at xlit.one
Wed Jan 13 11:47:45 EET 2021
Привет,
On 13.01.2021 11:26, 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
>
>
> memcache - это *TCP*, очень очень надо контролировать, чтобы у тебя не
> был каждый запрос - создание класса, коннект, прочитали, дисконнект.
> Т.е. это должен быть какой-то pipeline, в котором постоянно открыт
> коннект к мемкешу. Создать класс, коннект-прочитали-дисконнект - это
> ок 50-60мкс на лупбеке.
да, но это (а) у него таки постоянно открытый сокет и (б) смотрим в
другие варианты несть им числа -
https://en.wikipedia.org/wiki/List_of_in-memory_databases - и Redis один
из них, да
> Конструкторы и деструкторы - это тоже небесплатно кстати. Т.е.
> обслуживание ООП - это не халява.
Это Питон, в нём даже int - класс :) Если ты про строку "IPAddress(c)",
то её можно заменить на проверку скомпиленным регекспом - может будет
быстрее, но на самом деле там вот так:
ipa = IPAddress(c)
af = socket.AF_INET6 if ipa.version == 6 else socket.AF_INET
... socket.inet_atop(af, c), ...
с регекспами придется делать два match:
if re.match(v4, ...):
af = socket.AF_INET
elif re.match(v6, ...)
af = socket.AF_INET6
else:
continue
так шо тут бабка надвое сказала :)
>> Да, и inram cache - это тоже штука в себе.
> а какая разумная альтернатива?
>
>
> Тут не в альтернативе, а в реализации. Мемкеш например может заглючить
> (не теоретически, а практически) и что ты тогда будешь делать ?
именно поэтому ищется альтернативное решение с синхронной репликацей на
кшталт Галеры, только in-ram :) Я, собственно, именно поэтому в
оригинальном письме написал "при старте наполняет in-ram cache" - потому
что это НЕ memcached :)
если же говорить о "что ты тогда будешь делать", то в данном конкретном
случае я бы написал в memcached.service что-то на кшталт PostExec =
"myapp restart" :-)
Собственно, возвращаясь к исходному топику:
* есть ли у меня шансы получить несколько kpps такой задачи на Питоне?
* как правильно распараллелить две задачи:
o сначала computing + периодический Net I/O
o потом толстый Net I/O + периодический Net I/O
+ может select() можно?
Спасибо.
--
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/20210113/ad27571a/attachment.html>
More information about the uanog
mailing list