[英]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.