我有两个文件,每个文件当前运行在不同的线程上。一个用于运行烧瓶网站的主文件,一个用于单独线程中的discord机器人。我正在尝试调用discord端的异步方法,以便在收到请求后向用户发送消息。
#IN DISCORD FILE (discbot.py)
client = discord.Client()
async def registerSuccess(state, btag):
...
await client.wait_until_ready()
guilds = client.fetch_guilds()
async for guild in guilds:
name = await guild.name
print(name)
#IN FLASK/MAIN FILE (main.py)
@app.route("/oauth", methods=["POST", "GET"])
def oauth():
...
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
#loop.run_until_complete(discbot.registerSuccess(state, btag)) - Did not work
#asyncio.run(discbot.registerSuccess(state, btag)) - Did not work
# Both of these two above gave me:
#
# "RuntimeError: Task <Task pending coro=#<registerSuccess() running at
# /home/container/arcanabot.py:78> cb=[_run_until_complete_cb() at
# /usr/local/lib/python3.7/asyncio/base_events.py:157]> got Future
# <Future pending> attached to a different loop"
asyncio.run_coroutine_threadsafe(discbot.registerSuccess(state, btag), loop) - Did not work
#This one never managed to run the function at all
我对async函数和asyncio不是很熟悉,在上面的任何东西上都没有成功。
大多数时候,在以异步方式进行编码时,不需要使用线程,例如discord.py。我们可以使用asyncio.create_task
来实现您想要的。
asyncio.create_task((做什么
它提交协同程序来运行";在背景中";,即与当前任务和所有其他任务同时在等待点在它们之间切换。它返回一个称为";任务";您还可以使用它来取消协同程序的执行。
asyncio.run
无法工作,因为Discord客户端是使用该方法启动的。如果已经有另一个函数在运行,则无法在循环中启动另一个功能。
如何使用create_task
#IN DISCORD FILE (discbot.py)
client = discord.Client()
async def registerSuccess(state, btag):
await client.wait_until_ready()
async for guild in client.fetch_guilds(limit=None):
print(guild.name)
#IN FLASK/MAIN FILE (main.py)
@app.route("/oauth", methods=["POST", "GET"])
def oauth(...) -> None:
asyncio.create_task(discbot.registerSuccess(state, btag))