我对此错误的理解是,它抱怨它不在异步def函数中。但是,我的是,我甚至使用了loop = asyncio.new_event_loop()
和loop.run_until_complete(onInfoAsync(info,conn))
。以下是错误:
Timeout context manager should be used inside a task
File "C:\Users\ianfi\Documents\pythonStuff\PyQt5\ServerCalling\main.py", line 42, in onInfoAsync
dm = await member.create_dm()
File "C:\Users\ianfi\Documents\pythonStuff\PyQt5\ServerCalling\main.py", line 57, in onInfo
loop.run_until_complete(onInfoAsync(info,conn))
正如您在错误中看到的那样,它可以追溯到loop.run_until_complete(onInfoAsync(info,conn))
,后者将其放入任务中。我不知道我做错了什么,如果你需要更多的信息,请不要犹豫,我是新堆叠溢出。
下面是我尝试过的其他一些东西:我在网上发现,做asyncio.get_event_loop()
而不是做一个新的可能修复它,但是它只是错误地说没有循环可以得到。我也尝试过使用asyncio.set_event_loop(loop)
,但这并没有改变结果。
谢谢你的帮助!
编辑:我尝试了更多的东西,并做了一种中间人的功能。
async def between(info:str, conn):
task = asyncio.create_task(onInfoAsync(info,conn))
await task
虽然错误是抱怨它不在一个任务中(显然现在是这样),但它仍然是错误的。下面是具有此功能的跟踪:
Timeout context manager should be used inside a task
File "C:\Users\ianfi\Documents\pythonStuff\PyQt5\ServerCalling\main.py", line 51, in onInfoAsync
dm = await member.create_dm()
File "C:\Users\ianfi\Documents\pythonStuff\PyQt5\ServerCalling\main.py", line 36, in between
await task
File "C:\Users\ianfi\Documents\pythonStuff\PyQt5\ServerCalling\main.py", line 75, in onInfo
loop.run_until_complete(between(info,conn))
发布于 2022-09-30 03:42:41
Discord.py有一个与Hikari相同的问题:它不允许在它启动的事件循环之外进行异步API调用。在不使用循环的情况下创建新循环或调用不和谐将不可避免地使您遇到该错误。在我学习如何在异步函数之外使用它们的事件循环之前,我已经多次这样做了。你必须使用asyncio.run_coroutine_threadsafe(coro, loop)
。而且,asyncio.get_event_loop()
在异步函数之外总是会失败,除非是不和谐的循环,否则asyncio.set_event_loop(loop)
将无法工作。我能够让asyncio.create_task(coro)
工作,但前提是它是从事件循环中的异步函数调用的。
如果您的代码运行缓慢,您可以创建一个单独的线程,并以arg的形式传递循环:
import threading
import asyncio
import discord
class MyClient(discord.Client):
async def on_ready(self):
loop = asyncio.get_running_loop()
threading.Thread(target=self.separate_thread, args=[loop]).start()
def separate_thread(self, loop):
asyncio.run_coroutine_threadsafe(self.my_async_func(), loop)
async def my_async_func(self):
app_info = await self.application_info()
print(f'bot name: {app_info.name}')
intents = discord.Intents.default()
client = MyClient(intents=intents)
client.run('YOUR_TOKEN')
https://stackoverflow.com/questions/72753856
复制相似问题