[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