提问人:Ahmad Abdallah 提问时间:11/18/2023 更新时间:11/18/2023 访问量:37
如何在 Slackbot 中发送进度消息
How to send progress message in Slackbot
问:
我有这个松弛机器人,它在收到消息时执行长时间运行的任务。我想发送一条初始的“正在加载....”消息,然后如果任务的执行时间超过 ~15 秒,我会将上一条消息更新为“仍在加载...”。
我不确定如何解决这个问题,因为我的程序没有使用 AsyncApp,我能想到的唯一解决方案是使用asyncio.wait_for
我尝试使用更新消息,但即使我将超时设置为 1,更新也从未执行。此外,long_running_task() 函数最初不是协程,因此它无法正常运行。asyncio.wait_for(task(), timeout=15)
app = App()
async def long_running_task():
...
@app.event("message")
def event_message(client, event, say, logger):
initial_message = say("Loading")
start_message_ts = initial_message["ts"]
async def run_task():
try:
await asyncio.wait_for(long_running_task(), timeout=15)
except asyncio.TimeoutError:
await client.chat_update(
channel=event["channel"],
ts=start_message_ts,
text="Still loading..."
)
asyncio.ensure_future(run_task())
答:
1赞
Tricotou
11/18/2023
#1
如果你想让你的长任务保持为同步(而不是异步)例程,你可以在线程中启动它,并最终等待它:
from threading import Thread
import time
app = App()
def long_running_task():
...
@app.event("message")
def event_message(client, event, say, logger):
initial_message = say("Loading")
start_message_ts = initial_message["ts"]
thread = Thread(target=long_running_task, daemon=True)
thread.start()
started = time.time()
while thread.is_alive():
if time.time()-started>15:
client.chat_update(channel=event["channel"],ts=start_message_ts,text="Still loading...")
break
time.sleep(0.1)#Save CPU
(为了简单起见,我没有等待,但如果需要,您只需使用 asyncio 启动它)client.chat_update
评论
0赞
Ahmad Abdallah
11/18/2023
线程正在正确执行,但 while 循环似乎无法正常工作。我将加载时间从 15 更改为 1,但它没有更新消息。我尝试在 while 循环中记录一些东西,但它也没有打印
0赞
Tricotou
11/18/2023
您是否尝试检查/打印 while 循环之前的状态?只是为了确保至少你输入了它thread.is_alive()
0赞
Ahmad Abdallah
11/18/2023
它似乎没有运行任何超过 thread.start() 的内容,当我在 thread.start() 之后放置 print 语句时,没有打印任何内容
评论