首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >超时上下文管理器应在任务discord.py中使用。

超时上下文管理器应在任务discord.py中使用。
EN

Stack Overflow用户
提问于 2022-06-25 12:26:35
回答 1查看 193关注 0票数 0

我对此错误的理解是,它抱怨它不在异步def函数中。但是,我的是,我甚至使用了loop = asyncio.new_event_loop()loop.run_until_complete(onInfoAsync(info,conn))。以下是错误:

代码语言:javascript
运行
复制
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),但这并没有改变结果。

谢谢你的帮助!

编辑:我尝试了更多的东西,并做了一种中间人的功能。

代码语言:javascript
运行
复制
async def between(info:str, conn):
    task = asyncio.create_task(onInfoAsync(info,conn))
    await task

虽然错误是抱怨它不在一个任务中(显然现在是这样),但它仍然是错误的。下面是具有此功能的跟踪:

代码语言:javascript
运行
复制
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))
EN

回答 1

Stack Overflow用户

发布于 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的形式传递循环:

代码语言:javascript
运行
复制
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')
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72753856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档