我不确定为什么我在 python 中收到这个异步错误



我设法使api请求异步,但在尝试将其实现到主项目中时收到了此错误。这意味着我做错了什么?

错误

Exception has occurred: SynchronousOnlyOperation
You cannot call this from an async context - use a thread or sync_to_async.
File "C:UsersAdminDesktopdjangoProjectsdguacSignal.py", line 124, in main
await asyncio.wait([sigBuy(count) for count, bot in enumerate(activeBots)])
File "C:UsersAdminDesktopdjangoProjectsdguacSignal.py", line 126, in <module>
loop.run_until_complete(main())

我不明白这个错误意味着什么,也不明白我该如何修复它

这是我的代码

async def sigBuy(count):
bot_dict = Bot.to_dict(activeBots[count])
sigSettings_dict = Bot.to_dict(activeBots[count].sigSettings)
# Binance API and Secret Keys
Bclient = CryptoXLib.create_binance_client(sigSettings_dict['API_key'], sigSettings_dict['API_secret_key'])

p = round(float(percentage(7, bot_dict['ct_balance']) / (float(bin_asset_price['price']) / 1)), 8)
# Round and Asign the asset_amount
asset_amount = round(p, 2)
# shouldILog = await makeBuy(market, asset_amount, Bclient, sigSettings_dict['base_currency'])
shouldILog = 2
if shouldILog == 2:
asset_amount = int(asset_amount)
last_trade = await Bclient.get_all_orders(pair = Pair(market, sigSettings_dict['base_currency']))
last_trade = last_trade['response'][-1]
print(last_trade)
# asset_price = float(last_trade['cummulativeQuoteQty']) / float(last_trade['executedQty'])
asset_price = 0.00000123
buyInPrice = float(last_trade['cummulativeQuoteQty'])
for otrade in activeBots[count].opentrades.all():
trade = Bot.to_dict(otrade)
del trade['id']
otradesUpdate.append(trade)

openTrades_dict = {'bot_ID': bot_dict['id'], 'date': date, 'market': market, 'trade_mode': 'Buy', 'price': asset_price, 'amount': asset_amount, 'amount_in_base_currency': buyInPrice, 'result': 0}
otradesUpdate.append(openTrades_dict)
BotsUpdate.append(bot_dict)
SigSettingsUpdate.append(sigSettings_dict)
await Bclient.close()

async def main():
await asyncio.wait([sigBuy(count) for count, bot in enumerate(activeBots)])

loop.run_until_complete(main())

await asyncio.wait似乎是对的,因为你可以有一个可迭代的列表(尽管asyncio.wait应该是不推荐使用的iirc(,但异常消息有点让我失望。OP应该做的是包装Django ORM的查询集并让它执行,但Django的ORM延迟加载可能会导致一些问题。


错误的原始答案

你没有在等待正确的事情。您打算等待sigBuy,但您的asyncio.wait正在等待中。同时,您现在有一个没有执行任何操作的协同程序列表。

我建议你尝试两件事:

  • 如果您想同时运行,请保留列表,但不要等待它。相反,请使用asyncio.gather同时运行它们。asyncio.gather([sigBuy(count) for count, bot in enumerate(activeBots)])
  • 如果你想一次运行一个,请确保列表理解的工作方式相同:[await sigBuy(count) for count, bot in enumerate(activeBots)]

我使用解决了这个错误

async def main():
await asyncio.wait([sigBuy(count) for count, bot in enumerate(activeBots)])
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(main())

并且还首先将过滤和预取的django查询中的每个项目附加到新的activeBots列表中,以便异步代码接受它

最新更新