如何使请求排队,直到函数返回对先前请求的响应?

时间:2019-07-22 23:39:03

标签: python discord.py

当用户在特殊频道中发送!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)

一切正常,但是我只是不想加载太多系统,我需要一个循环以先进先出的顺序处理请求

2 个答案:

答案 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')