使用 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)
我创建了一个使用 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)