我对Python相对较新,并且正在为Discord开发机器人。我可以让机器人工作,但我遇到了一些新的命令。
我创建了一个名为" Member_City_Count"使用urllib.requests从站点解析json并将数据存储在文件中。我知道它可以自行运行,但是当调用bot来运行它时,我在函数运行完毕并且机器人关闭后得到以下错误:
(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,请道歉。
答案 0 :(得分:0)
discord api需要每N秒ping一次服务器(N大约为60)。
如果这没有发生,你会在某个时候得到一个例外(我相信下一个不和谐的api电话)。
如果您在工作流程的任何位置都有长时间运行的功能,这将阻止ping并导致客户端进入错误状态。
请记住,Python基本上是“单核心”。在CPU密集型任务期间。
这与asyncio有关,但它更多地与不和谐的具体使用模式有关。
您可以将重型阻止处理卸载到另一个进程中;否则将其分成许多微小的异步函数。
这里有一些模糊的相关信息: https://discordpy.readthedocs.io/en/latest/faq.html#what-does-blocking-mean