我正在嘗試使用asyncio製作一個簡單的Slack bot,主要使用示例here爲asyncio部分,here爲Slack bot部分。Python asyncio與Slack bot
這兩個例子都是獨立工作的,但是當我將它們放在一起時,看起來我的循環不會循環:它會經歷一次然後死亡。如果info
是一個長度等於1的列表,當消息在其中包含bot的聊天室中鍵入時發生,協程應該被觸發,但它永遠不會。 (所有協程現在都在嘗試打印消息,如果消息中包含「/ time」,它會讓機器人在要求的聊天室中打印時間)。鍵盤中斷也不起作用,我必須每次關閉命令提示符。
這裏是我的代碼:
import asyncio
from slackclient import SlackClient
import time, datetime as dt
token = "MY TOKEN"
sc = SlackClient(token)
@asyncio.coroutine
def read_text(info):
if 'text' in info[0]:
print(info[0]['text'])
if r'/time' in info[0]['text']:
print(info)
resp = 'The time is ' + dt.datetime.strftime(dt.datetime.now(),'%H:%M:%S')
print(resp)
chan = info[0]['channel']
sc.rtm_send_message(chan, resp)
loop = asyncio.get_event_loop()
try:
sc.rtm_connect()
info = sc.rtm_read()
if len(info) == 1:
asyncio.async(read_text(info))
loop.run_forever()
except KeyboardInterrupt:
pass
finally:
print('step: loop.close()')
loop.close()
我認爲這是循環的一部分,這壞了,因爲它似乎從來就沒給協程。所以也許一個問這個問題的簡短方式是什麼關於我的try:語句,以防止它循環,就像我跟着的asyncio示例一樣?有沒有關於它不喜歡的sc.rtm_connect()
?
我是新來的asyncio,所以我可能做一些愚蠢的事情。這甚至是嘗試去做這件事的最好方法嗎?最終,我想讓機器人做一些需要很長時間來計算的事情,並且我希望它能夠在那個時候保持響應,所以我認爲我需要在某種變化中使用asyncio或線程,但是我願意更好的建議。
非常感謝, 亞歷
我很擔心這個問題可能過於寬廣。有什麼方法可以提出更具體的問題,或者提出一系列構成這個問題的問題? –
相當確定被破壞的部分是循環,因爲它甚至從來沒有調用過程。我想一個簡短的問題是有什麼關於'sc.rtm_connect()'調用,防止asyncio循環對象像正常循環? –