如何实现Python函数one在后台运行的同时执行函数two
如何实现Python函数one在后台运行的同时执行函数two
嘿,我完全懂你的需求——你想让函数one在后台悄悄执行(毕竟它要睡2秒),同时让two立刻跑起来,而不是傻等one跑完才动对吧?你之前试协程没成功,大概率是没摸准异步写法的门道,我给你几个靠谱的实现方案:
方案一:用threading线程(最适合IO密集型场景)
你的场景里都是sleep等待,属于IO密集型任务,用线程是最简单高效的方式,直接把one放到子线程里跑,主线程继续执行two就行:
import time import threading def one(msg, a): time.sleep(a) print(msg) def two(msg, a): time.sleep(a) print(msg) # 创建线程对象,把one的参数传进去 thread_one = threading.Thread(target=one, args=("Hello, ", 2)) # 启动线程,one开始在后台执行 thread_one.start() # 主线程直接执行two,不用等one two("World!", 1) # 如果之后需要等one执行完再做其他操作,可以加这句: # thread_one.join()
运行后你会看到先输出World!(因为two只睡1秒),2秒后输出Hello, ,完美实现并行~
方案二:用asyncio协程(异步编程风格)
你之前试协程没成功,估计是用了普通的time.sleep(它会阻塞整个事件循环),得换成异步的asyncio.sleep,还要正确创建异步任务:
import asyncio # 把函数改成异步函数,用async修饰 async def one(msg, a): await asyncio.sleep(a) # 必须用异步sleep,不能用time.sleep! print(msg) async def two(msg, a): await asyncio.sleep(a) print(msg) async def main(): # 创建异步任务,让one在后台运行 task_one = asyncio.create_task(one("Hello, ", 2)) # 执行two,这时候one已经在后台等待了 await two("World!", 1) # 如果需要确保one执行完再结束程序,就await它 await task_one # 启动异步事件循环 asyncio.run(main())
这个方案和线程的效果一样,适合本来就用异步框架的项目,比如FastAPI、aiohttp这类。
方案三:用multiprocessing多进程(适合CPU密集型场景)
如果你的函数是CPU密集型(比如大量计算),那用多进程更合适(因为Python的GIL锁会限制线程的CPU并行),不过你的场景用这个有点大材小用,还是给你个参考:
import time import multiprocessing def one(msg, a): time.sleep(a) print(msg) def two(msg, a): time.sleep(a) print(msg) # 多进程必须加这个判断,避免子进程重复执行代码 if __name__ == "__main__": process_one = multiprocessing.Process(target=one, args=("Hello, ", 2)) process_one.start() two("World!", 1) # 等待进程结束 process_one.join()
总结一下:你的场景用线程或者协程就足够啦,多进程留着对付CPU密集的任务就行~
备注:内容来源于stack exchange,提问作者i_suckatcode
相关产品推荐
相关产品推荐

