我創建了一個使用 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")
uj5u.com熱心網友回復:
正如 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)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/410852.html
標籤:
上一篇:為每個異步API資料添加密鑰
下一篇:從同步代碼呼叫異步I/O方法
