【发布时间】: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