任务被破坏但仍在等待中! - Python不和谐机器人错误

Posted

技术标签:

【中文标题】任务被破坏但仍在等待中! - Python不和谐机器人错误【英文标题】:Task was destroyed but still pending! - Python Discord Bot Error 【发布时间】:2017-04-29 13:58:22 【问题描述】:

我对 Python 比较陌生,并且正在为 Discord 开发一个机器人。我可以让机器人工作,但我输入的几个新命令遇到了问题。

我创建了一个名为“Member_City_Count”的函数,它使用 urllib.requests 解析来自站点的 json 并将数据存储在文件中。我知道它可以自己运行,但是当调用机器人运行它时,在函数完成运行并且机器人关闭后我收到以下错误:

(Task was destroyed but it is pending! task: 
Task pending coro=<_run_event()running at C:\Users\dom\AppData\Local\Programs\Python\
Python35-32\lib\site_packages\discord\client.py:307>wait_for=Future pending 
cb=[Task._wakeup(), BaseSelectorEventLoop._sock_connect_done(964)()]>)

最让我困惑的是,大约四分之一的尝试运行它会成功!

async def on_message(message):
   if message.content.startswith(!Cities):
       await client.send_message(message.channel, "Collecting Data ...")
       Member_City_Count()
       await client.send_message(message.channel, "Complete")

抱歉,如果问题非常明显,仍在尝试处理 asyncio。

【问题讨论】:

我相信这是一个时间问题,但我不知道为什么我没有尝试解决它。我相信这是因为一个保活线程被阻止ping(由于某处长时间运行的回调)。 【参考方案1】:

discord api 需要每 N 秒 ping 一次服务器(N 大约是 60)。

如果这没有发生,你会在某个时候遇到异常(我相信在下一次不和谐 api 调用时)。

如果您在工作流程中的任何地方都有长时间运行的函数,这将阻止 ping 并导致您的客户端进入错误状态。

请记住,在 CPU 密集型任务期间,Python 本质上是“单核”。

这和asyncio有关,但更多的是与discord的具体使用模式有关。

您可以将繁重的阻塞处理卸载到另一个进程;否则将其拆分为许多微小的异步函数。

这里有一些模糊的相关信息: https://discordpy.readthedocs.io/en/latest/faq.html#what-does-blocking-mean

【讨论】:

以上是关于任务被破坏但仍在等待中! - Python不和谐机器人错误的主要内容,如果未能解决你的问题,请参考以下文章

Discord 机器人,任务被破坏

如何修复'错误:asyncio:任务已被破坏,但它正在等待处理! Python中的错误

列表中缺少分类但仍在数据库中

Discord Python Bot 在使用后台任务时破坏了我的命令

asyncio "任务已被破坏,但它正在等待处理!"在 pysnmp 示例程序中

haproxy 超时机制