Отвечать на несколько входящих запросов Slack-Bot параллельно - PullRequest
0 голосов
/ 28 июня 2018

Как новичок в этой области, я пытался справиться с ограничением GIL при использовании потоков для обработки нескольких входящих событий RTM для моего пользовательского бота Slack (написанного на python)

Вариант использования: Slack Bot, который будет добавлен к нескольким каналам, обслуживающим несколько запросов (команд-ботов) параллельно .

Вызов: Поскольку Threading в Python следует концепции GIL, входящие запросы ботов на самом деле не выполняются параллельно.

Решения рассмотрены: В качестве альтернативы я искал multiprocessing.pool, который позволил бы мне создавать множество рабочих, которые будут обрабатывать каждый запрос взаимоисключающим образом.

Вопрос: Поскольку я опрашиваю входящие события бесконечно внутри В то время как цикл , мне нужно было найти способ, который мог бы вызывать процессы, чтобы реагировать на них. каждый входящий запрос без блокировки обработки другого запроса (который может быть отправлен с другого канала в в то же время ) без исчерпания всей доступной памяти.

Код

slack_client = SlackClient(<bot_token>)
if slack_client.rtm_connect(auto_reconnect=True):
     while True:
         incoming_events = slack_client.rtm_read()
         command = parse_bot_mention(incoming_events) #this method returns the command issued to the bot in specific
         if command:
             handle_command_thread = Thread(target=handle_bot_command, args=(command))
             handle_command_thread.start()
         time.sleep(1) #RTM read delay of 1 sec

Этот подход прекрасно работает, когда я подписал этого бота на одноканальный , и ему было выдано несколько команд. Проблема состоит в том, что когда существует много каналов, состоящих из множества участников / канала, время отклика очень велико.

Существует ли парадигма подхода / программирования, которая может быть принята для решения этой проблемы?

1 Ответ

0 голосов
/ 17 ноября 2018

Кажется, что вы столкнулись с одной из слабостей Python, обрабатывая параллелизм. Чувак, это больно! Я поделюсь с вами некоторыми своими мыслями в рамках вашего вопроса, но не раньше, чем отправлю свои самые большие StackOverflow любимые мозоли ... ответьте на ваш вопрос, сказав вам попробовать что-то еще полностью ...

Раздражающий ответ: Кажется, что описываемый вами сценарий использования требует инструмента, который делает параллелизм первоклассным гражданином, поэтому я рекомендую вам изучить использование Golang. Исходя из довольно тяжелого фона Python, я обнаружил, что не так уж сложно найти Голанга. Голанг использует «стандартные процедуры», чтобы легко справляться с проблемами, подобными той, которая у вас есть. Он также имеет кучу других действительно хороших функций, которые вы должны проверить (например, набрав .. о да!). Поначалу немного странно, если вы привыкли к работе с Python Dev, но это довольно просто после того, как вы поймете концепции!

Не раздражает Ответ: Хорошо, если вы прочитали вышеизложенное, я ценю это, позвольте мне изложить несколько идей в рамках вашего вопроса.

  1. Один из вариантов - использовать библиотеку MultiProcessing, как вы упоминаете. Ваш лучший выбор, вероятно, будет заключаться в создании пула работников. Когда программа работает через цикл while и регистрирует, что команда была дана, она передаст эту команду открытому работнику для выполнения работы.

Таким образом, вы бы создали функцию для вставки в цикл while что-то вроде

Def Dispatch_worker_boi(self, command):
    use multiprocessing function to pitch to a worker (see Pool.apply_async)
  1. Единственная другая идея, которая приходит на ум, - это пакет AsyncIO. Если ваш бот ждет, слушая ответы команд, это может пригодиться. Я буду честен, хотя, у меня гораздо меньше опыта с этим пакетом. Стоит посмотреть!

Заключительные примечания: Еще один метод, указанный Chiragjn, заключается в использовании некоторого типа службы очереди, например сельдерея. Это позволит вам придерживаться Python и иметь гораздо большую масштабируемость, чем чистый подход Python. Честно говоря, если вы имеете дело с большим количеством масштабов, Голанг будет хорошо вам служить.

Надеюсь, что это было несколько полезно, всегда цените обратную связь, если у вас есть!

...