【Python】单线程异步多线程多进程实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 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 ,运行截图:

猜你喜欢

转载自blog.csdn.net/sinat_37967865/article/details/85260265