上一篇文章主要介绍了多任务场景下单线程异步、多线程、多进程如何选择,链接:多任务场景下单线程异步多线程多进程
这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有10个互不关联的10个任务
'''''''''
多进程版本:
使用多进程,时间比多线程更慢,为什么?因为创建进程的成本是要比线程高的,
虽然,它可以利用多核CPU的优势,但是在这里,用不上,就好比杀鸡用牛刀一样,大材小用,还提高了成本。
'''''''''import time
import multiprocessingfrom logger import Logger
logger = Logger("multiProcess").get_log()def processTask(t):logger.info("任务开始:%s", t)time.sleep(1)logger.info('任务耗时1秒钟')if __name__=='__main__':t3 = time.time()processes = [multiprocessing.Process(target = processTask, args=(t,)) for t in range(0, 10)]for p in processes:p.start()for p in processes:p.join()logger.info("总共耗时:%s ", time.time() - t3)
总共耗时:1.9219999313354492,运行截图:
'''''''''
多线程版本:
5个线程各负责一个任务,全部完成最后只花了1秒多一点时间,所以,对于阻塞性任务,例如IO密集型任务,
即使有GIL,还是能发挥多线程的作用的,毕竟,时间花在IO等待上,如果是CPU密集型任务效果不大。
'''''''''import time
import threadingfrom logger import Logger
logger = Logger("multiThread").get_log()def multiTask(t):logger.info("任务开始:%s", t)time.sleep(1)logger.info('任务耗时1秒钟')def main():threads = [threading.Thread(target = multiTask,args=(t,)) for t in range(0,10)]for t in threads:t.start()for t in threads:t.join()if __name__ == '__main__':t1 = time.time()main()logger.info("总共耗时:%s ",time.time()-t1)
总共耗时:1.003000020980835,运行截图:
'''''''''
单线程异步模型:
发现使用asyncio所的时间与多线程几乎一致。尽管它是单线程,但因为它没有多线程和进程的创建成本,
就是在单线程环境下,切换任务,当这个任务被阻塞时,立刻切换其他任务,当前面的任务完成时,在通知它。
'''''''''import asyncio
import timefrom logger import Logger
logger = Logger("asyncSingleThread").get_log()async def singleTask(t):logger.info("任务开始:%s",t)await asyncio.sleep(1)logger.info('任务耗时1秒钟')async def main(loop):tasks = [loop.create_task(singleTask(t)) for t in range(0, 10)]await asyncio.wait(tasks)t4 = time.time()
loop = asyncio.get_event_loop() # 建立 loop
loop.run_until_complete(main(loop)) # 执行 loop
loop.close() # 关闭 loop
logger.info("总共耗时:%s ", time.time() - t4)
总共耗时:1.0079998970031738 ,运行截图: