版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_37967865/article/details/85260265
上一篇文章主要介绍了多任务场景下单线程异步、多线程、多进程如何选择,链接:多任务场景下单线程异步多线程多进程
这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有10个互不关联的10个任务
'''''''''
多进程版本:
使用多进程,时间比多线程更慢,为什么?因为创建进程的成本是要比线程高的,
虽然,它可以利用多核CPU的优势,但是在这里,用不上,就好比杀鸡用牛刀一样,大材小用,还提高了成本。
'''''''''
import time
import multiprocessing
from 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 threading
from 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 time
from 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 ,运行截图: