Python 如何在后台运行任务时从异步函数返回值?
[编辑]Python 3.6 有一个功能: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
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()