如何异步调用无返回值的函数?附Python示例场景
异步调用阻塞函数的实现方法
针对你给出的阻塞函数slow(),要让调用线程无需等待其执行完成即可继续运行,有以下几种常用方案:
1. 使用threading模块创建线程
这是处理IO阻塞任务最常用的轻量方案,线程开销远低于进程:
import time import threading def slow() -> None: time.sleep(60) print("Slow function finished") def main(): print("Hello") # 创建并启动后台线程执行slow thread = threading.Thread(target=slow) thread.start() print("World!") # 无需等待60秒,立刻执行 if __name__ == "__main__": main()
启动线程后,主线程会直接继续执行后续代码,slow()在后台线程中运行。如果需要等待slow()执行完成,可在合适位置调用thread.join()。
2. 使用concurrent.futures.ThreadPoolExecutor
线程池适合批量提交异步任务,代码更简洁:
import time from concurrent.futures import ThreadPoolExecutor def slow() -> None: time.sleep(60) print("Slow function finished") def main(): print("Hello") # 初始化线程池并提交任务 executor = ThreadPoolExecutor() executor.submit(slow) print("World!") # 立刻执行 # 若需等待所有任务完成再退出程序,可调用 executor.shutdown(wait=True) if __name__ == "__main__": main()
3. 使用multiprocessing多进程
多进程适合CPU密集型任务,虽然IO阻塞场景下线程更高效,但也可以实现需求:
import time import multiprocessing def slow() -> None: time.sleep(60) print("Slow function finished") def main(): print("Hello") process = multiprocessing.Process(target=slow) process.start() print("World!") # 无需等待即可执行 # 等待进程完成可调用 process.join() if __name__ == "__main__": main()
4. 在asyncio异步场景中调用
如果你的代码基于asyncio框架,需要把同步阻塞函数放到线程池中执行:
import time import asyncio def slow() -> None: time.sleep(60) print("Slow function finished") async def main(): print("Hello") # 获取当前事件循环,用线程池执行slow loop = asyncio.get_running_loop() loop.run_in_executor(None, slow) print("World!") # 立刻执行 if __name__ == "__main__": asyncio.run(main())
内容的提问来源于stack exchange,提问作者sourcream
相关产品推荐
相关产品推荐

