Я занимаюсь разработкой ботов для вконтакте и обычно использую библиотеку multiprocessing, но сегодня пришла в голову идея переписать часть кода с использованием asyncio, почему-то подумалось что существенно выиграю в производительности.
Прочитал мануал по нему, потом ещё один, потом ещё двадцать и ничего не понял. На сколько прост и лёгок multiprocessing, на столько же непонятен asyncio. То ли мануалы состоят более чем полностью из г*вна и палок, то ли сам asyncio.
Наверное, немного помогу описав то, как у меня всё работает сейчас:
1. Для каждого бота создаётся новый процесс
mp.Process(name=bot.name + 'bot', target=self.bot, args=(bot.name, bot.status)).start()
2. Далее в этом процессе создаётся переменная с очередью, в которую ещё один процесс складывает сообщения для отправки
def bot(self, bot_name, bot_status, MAX_DELAY=4.0, MIN_DELAY=1.6, STEP=0.2, MAX_MSG_LEN=4000, MAX_ATTS=10):
q = mp.Queue()
mp.Process(name=bot_name + 'bot_client', target=self.client, args=(q, bot_name, bot_status)).start()
while True:
MSG = q.get()
if type(MSG) != dict: continue
... # далее идёт неинтересная отправка сообщения в диалог
def client(self, q, bot_name, bot_status, wait=45, lp_version=4, mode=2): # получение event'ов, обработка и добавление их в очередь на отправку
while True:
try:
lps = self.bots[bot_status][bot_name].getLPS(lp_version)
while True:
im = requests.get('https://' + lps['server'], params={'key': lps['key'], 'ts': lps['ts'], 'act': 'a_check', 'mode': mode, 'wait': wait, 'version': lp_version}).json()
if im.get('updates', None) != None:
lps['ts'] = im['ts']
if len(im['updates']) > 0:
for update in im['updates']:
if update[0] != 4: continue
u = self.bots[bot_status][bot_name].check_update(update, lp_version)
if u != None: mp.Process(target=lambda u: q.put_nowait(self.bots[bot_status][bot_name].f(u)), args=(u,)).start()
else:
print(bot_name, 'failed', im.get('failed', None))
if im.get('failed', None) == 1: lps['ts'] = im['ts']
else: lps = self.bots[bot_status][bot_name].getLPS(lp_version)
except Exception as e: print(e)
Как решить подобную задачу используя async/await/asyncio?