在Go语言中,以非阻塞的方式运行另一个任务非常简单。
import "net/http"
func Call(request http.Request) http.Response {
response := getResponse(request)
go doTask(request) // Non-blocking. No need to wait for result.
return response
}
func getResponse(request http.Request) http.Response {
// Do something synchronously here
return http.Response{}
}
func doTask(r http.Request) {
// Some task which takes time to finish
}
我如何在python中实现这一点?
我试过这样做:
import asyncio
import threading
from asyncio.events import AbstractEventLoop
loop: AbstractEventLoop
def initialize():
global loop
loop = asyncio.new_event_loop()
thread = threading.Thread(target=run_event_loop)
thread.start()
def run_event_loop():
loop.run_forever()
def call(request):
response = get_response(request)
# This should not block
asyncio.run_coroutine_threadsafe(do_task(request), loop)
return response
def get_response(r):
# Do something synchronously here
return 42
async def do_task(r):
# Some task which takes time to finish
return
这是可行的,但有点麻烦。
此外,python代码只对任务使用一个线程,而Go则自动将任务分派给多个进程(Kotlin也是如此)。
有更好的方法吗?
发布于 2022-03-15 02:30:14
我们可以使用concurrent.futures
模块运行非阻塞任务.ThreadPoolExecutor
对象用于此目的。您可以通过以下调整来修改代码以使用此方法:
from concurrent.futures import ThreadPoolExecutor
def call(request):
response = get_response(request)
with ThreadPoolExecutor(max_workers=4) as e:
e.submit(do_task)
return response
def get_response(r):
# Do something synchronously here
return 42
async def do_task(r):
# Some task which takes time to finish
return
response
将立即返回,do_task
将在返回结果后运行。
https://stackoverflow.com/questions/64094986
复制