我可以使用异步功能从不同的聊天中同时运行相同的命令吗?

Nil*_*Pal -2 async-await python-asyncio discord discord.py discord.py-rewrite

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

Łuk*_*ski 6

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

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()
Run Code Online (Sandbox Code Playgroud)

样本输出

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]
Run Code Online (Sandbox Code Playgroud)

该协程去,并且在不同的时间同时和完成执行执行,需要注意的是,这些都是很重要的不是在他们提交的相同顺序完成。

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

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]
Run Code Online (Sandbox Code Playgroud)

样本输出

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]
Run Code Online (Sandbox Code Playgroud)

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

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