我正在尝试使用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循环对象像正常循环? –