簡體   English   中英

並行響應多個傳入的Slack-Bot請求

[英]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的工作,一開始有點奇怪,但是獲得概念之后,這相當簡單!

不煩人的答案:好的,如果您閱讀以上內容,我將不勝感激,讓我在您的問題范圍內提出一些想法。

  1. 一種選擇是使用您提到的MultiProcessing庫。 您最好的選擇可能是實例化一組工作人員。 當程序通過while循環工作並注冊已給出命令時,它將把該命令傳遞給打開的工作程序以完成工作。

因此,您需要創建一個函數將類似while的內容插入while循環中,

Def Dispatch_worker_boi(self, command):
    use multiprocessing function to pitch to a worker (see Pool.apply_async)
  1. 想到的唯一另一個想法是AsyncIO軟件包。 如果您的機器人在等待偵聽命令響應,它可能會派上用場。 不過,老實說,我對該程序包的經驗要少得多。 值得一看!

最后說明: Chiragjn列出的另一種方法是使用某種類型的隊列服務,例如celery。 這將使您能夠堅持使用Python,並且比純Python方法具有更多的可伸縮性。 不過,老實說,如果您要處理的規模很大,Golang將為您提供良好的服務。

希望這對您有所幫助,請隨時提供反饋!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM