【问题标题】:how do I fix this error with async functions `sys:1: RuntimeWarning: coroutine 'finish_process' was never awaited`如何使用异步函数修复此错误 `sys:1: RuntimeWarning: coroutine 'finish_process' is never awaited`
【发布时间】:2022-01-16 11:22:14
【问题描述】:

这段代码的目标是让它运行主函数,称为main_process(),直到结束的异步函数,称为finish_process(),将变量finish_state设置为True,并且循环不会重复一遍。

import asyncio
import time

condition = True
finish_state = False
x = 0

async def finish_process(finish_state):
    finish_state = True
    time.sleep(5)
    return finish_state

async def main_process(condition,finish_state,x):
    while condition == True:
        finish_state = await asyncio.run(finish_process(finish_state))
        
        x = x + 1
        print(x)

        #if(x > 10):
        if(finish_state == True):
            print("Termina!")
            condition = False


asyncio.run(main_process(condition,finish_state,x))

我已经将异步函数调用的 await 放在另一个异步函数中,我不明白为什么它总是用 await 报错。

我认为用await 或旧的yield from 指示应该可以解决同时等待另一个函数的结果。

raise RuntimeError(
RuntimeError: asyncio.run() cannot be called from a running event loop
sys:1: RuntimeWarning: coroutine 'finish_process' was never awaited

【问题讨论】:

  • 来自官方docasyncio.run:“当另一个异步事件循环在同一个线程中运行时,无法调用此函数。”

标签: python python-3.x asynchronous async-await python-asyncio


【解决方案1】:

你的程序有以下问题:

  1. 您应该使用asyncio.create_taskasyncio.gather 来运行异步任务,而不是asyncio.run
  2. 可以用await asyncio.sleep(5)替换time.sleep(5)
import asyncio
import time

condition = True
finish_state = False
x = 0

async def finish_process(finish_state):
    finish_state = True
    await asyncio.sleep(5)
    return finish_state

async def main_process(condition,finish_state,x):
    while condition == True:
        finish_state = await asyncio.create_task(finish_process(finish_state))
        
        x = x + 1
        print(x)

        #if(x > 10):
        if(finish_state == True):
            print("Termina!")
            condition = False


asyncio.run(main_process(condition,finish_state,x))

输出:

1
Termina!

【讨论】:

  • 你的意思是同时拥有一个从未修改过的名为finish_state 的全局变量,而是两个局部变量?
  • @FrankYellin 在这里使用(asyncio.run(main_process(condition,finish_state,x))),但是函数内部有一个同名的局部变量。
  • 好的。它看起来有点奇怪。混淆局部变量和全局变量是一个常见的错误。但你清楚地知道自己在做什么。
  • @FrankYellin 是的,我刚刚解决了问题。
猜你喜欢
  • 2020-12-01
  • 2022-08-24
  • 2019-06-23
  • 2022-12-14
  • 2013-05-28
  • 2019-09-09
  • 2018-12-06
  • 2019-08-19
  • 1970-01-01
相关资源
最近更新 更多