【发布时间】:2016-08-15 13:15:34
【问题描述】:
我正在尝试使用 asyncio 制作一个简单的 Slack 机器人,主要使用示例 here 用于 asyncio 部分,here 用于 Slack 机器人部分。
这两个示例都可以单独运行,但是当我将它们放在一起时,我的循环似乎没有循环:它通过一次然后死掉。如果info 是一个长度等于 1 的列表,当在聊天室中输入一条消息时会发生这种情况,其中包含机器人,则应该触发协程,但它永远不会触发。 (协程现在要做的就是打印消息,如果消息包含“/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 循环对象像正常一样循环?
标签: python asynchronous python-asyncio slack-api