2015-11-11 372 views
1

我正在構建一個電報機器人,並開始使用api包裝器的示例結構。在py腳本中有一個無限循環,它輪詢電報api以獲取bot的新消息。並逐個處理每條新消息。從python腳本啓動並行進程?

while True: 
    for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10): 
     chat_id = update.message.chat.id 
     update_id = update.update_id 
     if update.message.text: 
      #do things with the message \ start other functions and so on 

我現在預見已經什麼,是有一些消息\請求 - 我將有一個更長的處理時間和其他消息,如果連在同一時間傳來 - 等待。對於用戶來說,它看起來像是在延遲迴答。歸結爲一個簡單的依賴:更多的用戶聊天=更多的延遲。

我在想這個問題:我可以讓這個主腳本bot.py運行並檢查新消息,並且每次消息到達時 - 此腳本將啓動另一個腳本answer.py來處理消息和回覆。

並開始儘可能多的並行腳本answer.py

我還可以使用bot.py將所有傳入的內容記錄到數據庫中,併發送有關發送消息的用戶的引用數據,然後讓另一個進程處理所有新記錄的數據並將其標記爲已回答 - 但是也應該處理每個新的條目相互平行。

我不是蟒蛇大師,並正在尋求一些想法和指導如何解決這個問題?謝謝!

回答

1

你需要的是線程,或一些框架,可以異步處理很多請求,例如, Python 3.4中的Twisted,Tornado或asyncio。

下面是一個使用線程的實現:

import threading 

def handle(message): 
    ##### do your response here 

offset = None 

while True: 
    for update in bot.getUpdates(offset=offset, timeout=10): 
     if update.message.text: 
      t = threading.Thread(target=handle, args=(update.message,)) 
      t.start() 

     offset = update.update_id + 1 

     ##### log the message if you want 

這樣,調用handle()不會阻塞,循環可以繼續處理下一條消息。

對於更復雜的情況,例如,如果你不得不從同chat_id保持整個消息的狀態,我建議考慮看看telepot,和這樣的回答:

Handle multiple questions for Telegram bot in python

總之,telepot產卵爲您提供線索,讓您不必擔心底層細節,並讓您專注於手頭的問題。

+0

謝謝!你的圖書館似乎是一個偉大的工具!我即將創建另一個機器人,爲此我將使用您的圖書館!我已經有了一個 - 我將不得不重構代碼來使用傳送,但是我已經通讀了您的項目,並且發現它非常有用!:)謝謝! 關於線程 - 我確實嘗試在我的主機器上執行線程,但事情不斷崩潰...不知道什麼是錯誤的..我只是切換到傳送:) – GeekSince1982

+0

你必須非常小心使用線程;當兩個線程嘗試更改相同的數據時,事情會變得很糟糕,並且這些類型的錯誤可能很難追蹤(因爲它們可能不會一直髮生)。如果你真的需要同時處理很多請求,我推薦使用異步方式。異步編程與經典編程有點不同,但是值得付出努力。 –

+0

謝謝!我對Python非常陌生,而且這些任務很多,所以我需要更多的閱讀,但是你給了我一個很好的kickstart!:)謝謝! – GeekSince1982