Python 如何在后台运行任务时从异步函数返回值?

Python 如何在后台运行任务时从异步函数返回值?,python,asynchronous,async-await,return,python-asyncio,Python,Asynchronous,Async Await,Return,Python Asyncio,[编辑]Python 3.6 有一个功能: def main(request): do_something() // task takes some days responce = {'status': 'started!'} return responce 我需要它在dou something()启动后立即返回响应,而不是等待dou something()完成。 我已经试过了: def main(request): Thread(target=do_somet

[编辑]Python 3.6

有一个功能:

def main(request):
    do_something() // task takes some days
    responce = {'status': 'started!'}
    return responce
我需要它在dou something()启动后立即返回响应,而不是等待dou something()完成。 我已经试过了:

def main(request):
    Thread(target=do_something).start()
    responce = {'status': 'started!'}
    return responce
只有do_something()中不包含线程时,它才起作用。请在此处“无额外代码行”帮助使用async Wait

[更新]这仅在Jupyter中有效,但在docker容器中无效(产生“RuntimeError:线程中没有当前事件循环”):

[更新]问题不在于线程和异步函数,而在于azure函数。
[关闭]

使用
asyncio

import asyncio


async def do_something():
    for i in range(10):
        print(f"Been doing expensive stuff for {i} seconds.")
        await asyncio.sleep(1)


def handle_request(request):
    task = asyncio.create_task(do_something())
    response = {request: {"status": "started!"}}
    return response, task


async def main():
    response, task = handle_request("request")
    print(response)
    await task
    print("Program finished.")


if __name__ == "__main__":
    asyncio.run(main())
输出:

{'request':{'status':'started!'}
已经做了0秒昂贵的事情。
做了一秒钟昂贵的事情。
做了2秒钟昂贵的事情。
做了3秒钟昂贵的事情。
做了4秒钟昂贵的事情。
做了5秒钟昂贵的事情。
做了6秒钟昂贵的事情。
做了7秒钟昂贵的事情。
做了8秒钟昂贵的事情。
做了9秒钟昂贵的事情。
节目结束了。
或者使用
线程

import time
from threading import Thread


def do_something():
    for i in range(10):
        print(f"Been doing expensive stuff for {i} seconds.")
        time.sleep(1)


def handle_request(request):
    thread = Thread(target=do_something)
    thread.start()
    response = {request: {"status": "started!"}}
    return response, thread


def main():
    response, thread = handle_request("request")
    print(response)
    thread.join()
    print("Program finished.")


if __name__ == "__main__":
    main()
输出:

已经做了0秒昂贵的事情。
{'request':{'status':'started!'}
做了一秒钟昂贵的事情。
做了2秒钟昂贵的事情。
做了3秒钟昂贵的事情。
做了4秒钟昂贵的事情。
做了5秒钟昂贵的事情。
做了6秒钟昂贵的事情。
做了7秒钟昂贵的事情。
做了8秒钟昂贵的事情。
做了9秒钟昂贵的事情。
节目结束了。

请您提供一个更完整的例子,确切说明您看到的问题是什么?@Roy2012,当使用Thread().start()时,线程在内部,它只是“死”了,没有任何例外。可能是程序刚刚完成,没有等待内部线程之一吗?不,因为每个我的内部线程最后都会创建一些文件,再加上在处理过程中写入日志。只有一些最初的日志,根本没有文件。所以。。可能主线程已经完成,程序退出,它只是不等待任何内部(其他)线程完成。是这样吗?必须尝试使用“join”来等待其他线程吗?运行(main())不起作用,因为我使用Python3.6,而且最好在main函数内完成所有工作,因为main()是Azure函数
import time
from threading import Thread


def do_something():
    for i in range(10):
        print(f"Been doing expensive stuff for {i} seconds.")
        time.sleep(1)


def handle_request(request):
    thread = Thread(target=do_something)
    thread.start()
    response = {request: {"status": "started!"}}
    return response, thread


def main():
    response, thread = handle_request("request")
    print(response)
    thread.join()
    print("Program finished.")


if __name__ == "__main__":
    main()