使用 Sympy 冻结机器人 (discord.py)

Bot freezing with Sympy (discord.py)

我创建了一个使用 Sympy 进行数学运算的命令。问题是,如果我输入需要大量计算的东西(例如 9999999**999999),机器人会完全冻结,直到发送包含结果的消息。

这是我的代码:

@client.command(name="math")
async def math_command(ctx, calc = None):

    if calc == None:
        return

    try:
        result = sympy.sympify(calc)
        await ctx.reply(f"Result: {result}")
    except:
        await ctx.reply("Invalid")

正如 Lukas Thaler 所说,sympy 是一个同步库,它不适合在异步代码中使用,但是您可以使用 loop.run_in_executor 方法 运行非阻塞方式:

import asyncio
from functools import partial

loop = asyncio.get_event_loop()  # in py 3.10+ use `asyncio.get_running_loop()`

async def run_blocking(func, *args, **kwargs):
    """Run any blocking, synchronous function in a non-blocking way"""
    callback = partial(func, *args, **kwargs)
    return await loop.run_in_executor(None, callback)


# inside the command
result = await run_blocking(sympy.sympify, calc)