[英]Respond to multiple incoming Slack-Bot requests in parallel
作为该领域的新手,我一直在尝试使用线程解决GIL限制,以便为我的自定义Slack机器人处理多个传入RTM事件(用python编写)
用例:一个Slack Bot,它将被添加到必须并行处理多个请求(机器人命令)的多个通道中。
面临的挑战:由于python中的线程遵循GIL的概念,因此传入的bot请求实际上并未并行执行。
解决方案进行了研究:作为一种选择,我正在研究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
当我将此漫游器订阅到单个频道并且向其发出多个命令时,此方法效果很好。 问题是当存在多个参与者/通道的多通道时,响应时间会很长。
是否可以采用任何方法/编程范例来解决此问题?
似乎您在处理并发性时遇到了Python的弱点之一。 杜德,那真是痛苦! 我将把您的一些想法限制在您的问题范围内,但不要在我犯下我最大的 StackOverflow宠物烦恼之前...通过告诉您完全尝试其他方法来回答您的问题...
烦人的回答:您描述的用例似乎需要使并发成为一流公民的工具,这就是为什么我建议您考虑使用Golang的原因。 来自非常沉重的Python背景,我发现拿起Golang并不是很困难。 Golang使用“例程”轻松处理类似您遇到的问题。 它还具有许多您应该签出的其他非常好的功能(例如键入..哦,是的!)。 如果您习惯了Python Dev的工作,一开始有点奇怪,但是获得概念之后,这相当简单!
不烦人的答案:好的,如果您阅读以上内容,我将不胜感激,让我在您的问题范围内提出一些想法。
因此,您需要创建一个函数将类似while的内容插入while循环中,
Def Dispatch_worker_boi(self, command):
use multiprocessing function to pitch to a worker (see Pool.apply_async)
最后说明: Chiragjn列出的另一种方法是使用某种类型的队列服务,例如celery。 这将使您能够坚持使用Python,并且比纯Python方法具有更多的可伸缩性。 不过,老实说,如果您要处理的规模很大,Golang将为您提供良好的服务。
希望这对您有所帮助,请随时提供反馈!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.