【问题标题】:Can i run same command concurrently from different chats using async function? [closed]我可以使用异步功能从不同的聊天中同时运行相同的命令吗? [关闭]
【发布时间】:2021-04-02 18:20:00
【问题描述】:

我最近开始玩 discord 机器人,但我有一个疑问,那就是是否必须将 async 函数用于 discord 命令。如果是,那么有人可以告诉我区别(根据不和谐的机器人行为)

【问题讨论】:

    标签: async-await discord discord.py python-asyncio discord.py-rewrite


    【解决方案1】:

    同步基本上意味着您一次只能执行一件事。异步意味着您可以一次执行多个操作,而不必完成当前操作即可继续执行下一个操作。这是一个异步编程的例子。

    import asyncio
    import random
    
    async def my_coroutine(id):
        process_time = random.randint(1, 5)
        await asyncio.sleep(process_time)
    
        print(f'Coroutine: {id}, has succesfully completed after {process_time} seconds')
    
    
    async def main():
        tasks = []
        for i in range(10):
            tasks.append(asyncio.ensure_future(my_coroutine(i)))
    
        await asyncio.gather(*tasks)
    
    
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()
    

    样本输出

    Coroutine: 4, has successfully completed after 1 seconds
    Coroutine: 7, has successfully completed after 2 seconds
    Coroutine: 8, has successfully completed after 2 seconds
    Coroutine: 0, has successfully completed after 3 seconds
    Coroutine: 1, has successfully completed after 3 seconds
    Coroutine: 2, has successfully completed after 4 seconds
    Coroutine: 6, has successfully completed after 4 seconds
    Coroutine: 3, has successfully completed after 5 seconds
    Coroutine: 5, has successfully completed after 5 seconds
    Coroutine: 9, has successfully completed after 5 seconds
    [Finished in 5.0s]
    

    协程并发执行并在不同的时间完成执行,重要的是要注意这些按照提交时的相同顺序完成。

    这是正常同步编程中的相同代码

    import random
    import time
    
    def work(id):
        process_time = random.randint(1, 5)
        time.sleep(process_time)
    
        print(f'Function: {id}, has succesfully completed after {process_time} seconds')
    
    
    def main():
        for i in range(10):
            work(i)
    
    
    main()
    

    样本输出

    Function: 0, has successfully completed after 5 seconds
    Function: 1, has successfully completed after 3 seconds
    Function: 2, has successfully completed after 4 seconds
    Function: 3, has successfully completed after 2 seconds
    Function: 4, has successfully completed after 3 seconds
    Function: 5, has successfully completed after 4 seconds
    Function: 6, has successfully completed after 2 seconds
    Function: 7, has successfully completed after 5 seconds
    Function: 8, has successfully completed after 5 seconds
    Function: 9, has successfully completed after 1 seconds
    [Finished in 24.0s]
    

    所有函数都按照它们被调用的顺序完成。

    基本上,如果库是用普通同步代码编写的,您将无法同时使用多个命令/事件,您需要等到前一个完成,然后调用下一个.

    【讨论】:

    • 根据您的回答,如果我有一个需要 10 秒才能执行的命令,所以如果我从两台服务器上点击该命令,那么它们将被一一执行,但如果我一次点击 2 个不同的命令它们将被并行执行。
    • 但在我的情况下,它并没有像你说的那样发生
    猜你喜欢
    • 2022-11-19
    • 1970-01-01
    • 2022-01-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 2018-05-30
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多