【发布时间】:2018-04-02 14:10:08
【问题描述】:
使用 discord.py 制作 Discord 机器人,这是我第一次使用 asyncio,也可能是我第一次在 Python 中遇到这种令人沮丧的事情。
这个问题的重点不是教我如何使用 asyncio,而是教我如何避免使用它,即使它不是正确的做事方式。
所以我需要从常规的 def 函数运行不和谐的客户端协程。经过数小时的搜索,我发现了这个:asyncio.get_event_loop().run_until_complete(...)。我设置了一个小脚本来测试它:
import asyncio
async def test():
print('Success')
asyncio.get_event_loop().run_until_complete(test())
而且效果很好。所以我继续尝试在不和谐的机器人中使用它:
import discord
import asyncio
client = discord.Client()
@client.event
async def on_ready():
test()
def test():
asyncio.get_event_loop().run_until_complete(run())
async def run():
print('Success')
client.run('TOKEN_HERE')
我得到一个错误...堆栈跟踪/输出:
Success
Ignoring exception in on_ready
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 307, in _run_event
yield from getattr(self, event)(*args, **kwargs)
File "C:/Users/OverclockedSanic/PyCharm Projects/asyncio test/test.py", line 8, in on_ready
test()
File "C:/Users/OverclockedSanic/PyCharm Projects/asyncio test/test.py", line 11, in test
asyncio.get_event_loop().run_until_complete(run())
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 454, in run_until_complete
self.run_forever()
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 408, in run_forever
raise RuntimeError('This event loop is already running')
RuntimeError: This event loop is already running
奇怪的是最后的“成功”部分......我尝试了其他一些测试,看看我是否可以从协程返回数据或执行更多的东西,但它不能。
我什至尝试用client.loop 替换asyncio.get_event_loop(),但也没有用。
我找了 2 天,仍然没有解决方案。有什么想法吗?
编辑:按照 cmets 中的建议将 get_event_loop() 替换为 new_event_loop() 提出了以下问题:
Ignoring exception in on_ready
Traceback (most recent call last):
File "C:\Program Files\Python36\lib\site-packages\discord\client.py", line 307, in _run_event
yield from getattr(self, event)(*args, **kwargs)
File "C:/Users/USER/PyCharm Projects/asyncio test/test.py", line 8, in on_ready
test()
File "C:/Users/USER/PyCharm Projects/asyncio test/test.py", line 11, in test
asyncio.new_event_loop().run_until_complete(run())
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 454, in run_until_complete
self.run_forever()
File "C:\Program Files\Python36\lib\asyncio\base_events.py", line 411, in run_forever
'Cannot run the event loop while another loop is running')
RuntimeError: Cannot run the event loop while another loop is running
【问题讨论】:
-
查看examples on the github page。需要注意的重要一点是,您不必直接处理事件循环,
discord.py模块将为您处理这些事情 -
我发现的唯一有趣的东西是 background_task.py,甚至没有太大帮助......
-
如果你不想让
test成为协程,你需要在一个单独的循环中运行你的代码。asyncio.new_event_loop
标签: python python-3.x python-asyncio discord discord.py