当用户在特殊频道中发送!bot时,代码将运行一个功能,该功能运行20-30秒(取决于some_var)。我的问题是,如果几个人编写!bot,代码将在多个线程中将其反转。如何为这些请求排队?
我试图了解asyncio,discord.ext.tasks,但不知道它是如何工作的
@client.command()
async def test(ctx, *args):
data = args
if data:
answer = some_function(data[0]) #works from 5 seconds to 1 minute or more
await ctx.send(answer)
一切正常,但是我只是不想加载太多系统,我需要一个循环以先进先出的顺序处理请求
答案 0 :(得分:0)
将some_function()
设为async
,然后await
。然后所有test
命令将被同时处理。
async some_function(...):
# something to do
@client.command()
async def test(ctx, *args):
if args:
answer = await some_function(data[0])
await ctx.send(answer)
答案 1 :(得分:0)
您可以使用asyncio.Queue
对任务进行排队,然后在后台循环中依次处理它们:
import asyncio
from discord.ext import commands, tasks
queue = asyncio.Queue()
bot = commands.Bot('!')
@tasks.loop(seconds=1.0)
async def executor():
task = await queue.get()
await task
queue.task_done()
@executor.before_loop
async def before():
await bot.wait_until_ready()
@bot.command()
async def example(ctx, num: int):
await queue.put(helper(ctx, num))
async def helper(ctx, num):
await asyncio.sleep(num)
await ctx.send(num)
executor.start()
bot.run('token')