【问题标题】:Respond to multiple incoming Slack-Bot requests in parallel并行响应多个传入的 Slack-Bot 请求
【发布时间】:2018-06-28 06:27:22
【问题描述】:

作为该领域的新手,我一直在尝试解决 GIL 限制,同时使用线程为我的自定义 Slack 机器人(用 python 编写)处理多个传入的 RTM 事件

用例: 一个 Slack Bot,将被添加到 多个 必须同时处理多个请求(机器人命令) 的通道中。

面临的挑战: 由于 python 中的线程遵循 GIL 的概念,传入的机器人请求实际上是并行执行的。

解决方案研究: 作为替代方案,我正在研究 multiprocessing.pool,这将使我能够产生许多工作人员,这些工作人员将以互斥的方式为每个请求提供服务。

问题:由于我在 While 循环中无限地轮询传入事件,因此我需要找到一种可以产生进程的方法响应每个传入的请求,而不会阻塞另一个请求的处理(可以在同时从另一个通道发布)不会耗尽所有可用内存。

代码

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

当我让这个机器人订阅了一个单一频道,并且有多个命令发给它时,这种方法可以正常工作。问题是当存在由许多参与者/频道组成的多个频道时,响应时间很长。

是否有任何方法/编程范式可以用来解决这个问题?

【问题讨论】:

  • 多处理解决方案似乎是正确的方向。另一个想法 - 将您的 handle_bot_command 设置为一个单独的应用程序,并让多个 celery 工作人员异步使用提交的命令。代理需要 Redis/RabbitMQ 或类似的东西。

标签: python multithreading python-multiprocessing slack


【解决方案1】:

您似乎遇到了 Python 的弱点之一,即处理并发性。哥们,好痛啊!我会在你的问题范围内向你提出一些我的想法,但不是在我提交我的 最大 StackOverflow 讨厌的问题之前......通过告诉你完全尝试其他东西来回答你的问题......

烦人的答案:您描述的用例似乎需要一个使并发成为一等公民的工具,这就是为什么我建议您考虑使用 Golang。来自相当沉重的 Python 背景,我发现学习 Golang 并不是非常困难。 Golang 使用“go-routines”来轻松处理您遇到的问题。它还有许多其他非常好的功能,你应该检查一下(比如打字……哦,是的!)。如果你习惯了 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 包。如果您的 bot 等待监听命令响应,它可能会派上用场。不过老实说,我对那个包的经验要少得多。值得一看!

最后说明: Chiragjn 列出的另一种方法是使用某种类型的队列服务,例如 celery。这将使您能够坚持使用 Python,并且比纯 Python 方法具有更多的可扩展性。不过老实说,如果你要处理大量的规模,Golang 会很好地为你服务。

希望这对您有所帮助,如果您有任何反馈,请随时感谢!

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多