python - 检查 asyncio.get_event_loop() 是否已完成?

标签 python python-3.x asynchronous python-asyncio

我有一个自定义背景装饰器。当我在后台运行一个函数时,如何检查我在后台启动的所有函数是否都已完成,直到我返回?

#background decorator
def background(fn):
    def wrapped(*args, **kwargs):
        return asyncio.get_event_loop().run_in_executor(None, fn, *args, **kwargs)
    return wrapped
#myfunction that I run in the background
@background
def myfunction():
    #run some tasks
#main here I call "myfunction"
def main():
    for i in list:
        myfunction()
#check if all myfunction's are done then return (MY PROBLEM)

最佳答案

您可以创建 myfunction() 任务列表,然后使用 asyncio.wait() 运行它们

import asyncio
from timeit import default_timer as timer

def background(fn):
    def wrapped(*args, **kwargs):
        return asyncio.get_event_loop().run_in_executor(None, fn, *args,**kwargs)
    return wrapped

@background
def myfunction(tasknum):
    print("tasknum",tasknum," -- started at", timer())
    #add lots of numbers to simulate some task...
    x = 0
    for n in range(20000000):
        x += n
    print("tasknum",tasknum," -- finished at", timer())

def main():
    print("main -- started at", timer())
    background_loop = asyncio.get_event_loop()
    tasks = []

    for i in range(4):
        tasks.append(myfunction(i))

    try:
        background_loop.run_until_complete(asyncio.wait(tasks))
    finally:
        background_loop.close()

    print("main -- finished at", timer())

main()
print('returned from main')

输出:

main -- started at 38203.24129425
tasknum 0  -- started at 38203.241935683
tasknum 1  -- started at 38203.24716722
tasknum 2  -- started at 38203.257414232
tasknum 3  -- started at 38203.257518981
tasknum 1  -- finished at 38206.503383425
tasknum 2  -- finished at 38206.930789807
tasknum 0  -- finished at 38207.636296604
tasknum 3  -- finished at 38207.833483453
main -- finished at 38207.833736195
returned from main

请注意,get_event_loop() 在 python 3.10 中已被弃用,因此最好的解决方案可能是在装饰器定义之前启动后台循环,然后直接使用循环名称:

background_loop = asyncio.new_event_loop()

def background(fn):  
    def wrapped(*args, **kwargs):
        return background_loop.run_in_executor(None, fn, *args, **kwargs)
    return wrapped

关于python - 检查 asyncio.get_event_loop() 是否已完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69609270/

相关文章:

python - 如何填写这个Python列表?

python - 无法在 pygame 中生成多个敌人

javascript - 重用通过解构创建的对象字面量

c# - 想知道 async/await 解决方案是否干净

python - 使用 Python SciPy 量化曲线拟合的质量

python - 不等于(!=)操作在 while 循环中不起作用

python - 在 Python 3 map() 中使用多个函数

django - 错误: client intended to send too large body

c++ - 异步事件 : already defined linker error [Windows Update API]

python - Django:作为值列表查询一部分的相关模型值列表