【问题标题】:Running an asynchronous function in parallel with every other function与其他所有函数并行运行一个异步函数
【发布时间】:2021-07-01 09:44:39
【问题描述】:

这就是我想要做的。

我有多个异步函数和一个单独的异步函数,比如说main。我想将这个 main 函数与我调用的所有其他函数一起调用。

我在电报机器人中使用这种结构,并根据某个命令调用函数。但我想对任何传入消息运行main,包括带有上述命令的消息,其中还调用了另一个函数。所以在那种情况下,我想同时运行(第一个命令特定函数然后main函数)

我相信这可以按照某人的建议使用threading.RLock() 来完成,但我不知道如何。

最好的方法是什么?

【问题讨论】:

    标签: python multithreading asynchronous telegram


    【解决方案1】:

    您可以将aiotelegramasynciocreate_task() 结合使用。

    虽然线程也可以完成这项工作,但 they don't seem to be as good as asynchronous execution

    您可以选择任何提供 async 上下文的电报框架,如 Bot.run()aiotelegram 中所做的那样,或者您甚至可以实现自己的 API 客户端,只要确保您在异步 ( ASGI) 上下文。

    然后主要的想法是调用asyncio.create_task() 来启动main() 函数与运行Telegram Bot 命令的其余函数并行。

    这是一个例子(注意我用my_main()代替main()):

    import asyncio
    from aiotg import Bot, Chat
    
    bot = Bot(api_token="...")
    
    async def other_command():
        #Replace this with the actual logic
        await asyncio.sleeep(2)
    
    async def my_main():
        # Replace this with the actual parallel task
        await asyncio.sleep(5)
    
    @bot.command(r"/echo_command (.+)")
    async def echo(chat: Chat, match):
        task = asyncio.create_task(my_main())
        return chat.reply(match.group(1))
    
    @bot.command(r"/other_command (.+)")
    async def other(chat: Chat, match):
        task = asyncio.create_task(my_main())
        result = other_command()
        return chat.reply(result)
    
    bot.run()
    

    重要的是要知道,使用这种方法,永远不会等待或检查任务是否完成,因此可能难以跟踪异常或失败的执行,以及需要保留的来自 main() 的任何结果。 一个简单的解决方案是声明一个全局的dict() 来存储任务,这样你就可以稍后返回它们(即使用特定的电报命令,或始终在某些现有的电报命令中运行)。

    无论您决定跟踪任务的逻辑是什么,您都可以使用Task.done()Task.result() 检查它们是否已完成,以及它们的结果(如果有)。有关如何管理任务的更多详细信息,请参阅their official doc

    【讨论】:

    • 我已经在使用一个名为“Pyrogram”的python框架。但是我需要将一个功能与 100 多个其他功能一起使用,按照您的方式,它会太长,因为我相信肯定有更简单的方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-16
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 2021-09-23
    • 1970-01-01
    相关资源
    最近更新 更多