如何在 Slackbot 中发送进度消息

How to send progress message in Slackbot

提问人:Ahmad Abdallah 提问时间:11/18/2023 更新时间:11/18/2023 访问量:37

问:

我有这个松弛机器人,它在收到消息时执行长时间运行的任务。我想发送一条初始的“正在加载....”消息,然后如果任务的执行时间超过 ~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())
异步 python-asyncio slack-api

评论


答:

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 语句时,没有打印任何内容