博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Python】单线程异步多线程多进程实例
阅读量:4100 次
发布时间:2019-05-25

本文共 1928 字,大约阅读时间需要 6 分钟。

上一篇文章主要介绍了多任务场景下单线程异步、多线程、多进程如何选择,链接:

这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有10个互不关联的10个任务

'''''''''多进程版本:使用多进程,时间比多线程更慢,为什么?因为创建进程的成本是要比线程高的,虽然,它可以利用多核CPU的优势,但是在这里,用不上,就好比杀鸡用牛刀一样,大材小用,还提高了成本。'''''''''import timeimport multiprocessingfrom logger import Loggerlogger = 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 timeimport threadingfrom logger import Loggerlogger = 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 asyncioimport timefrom logger import Loggerlogger = 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()  # 建立 looploop.run_until_complete(main(loop))  # 执行 looploop.close()  # 关闭 looplogger.info("总共耗时:%s ", time.time() - t4)

总共耗时:1.0079998970031738 ,运行截图:

转载地址:http://vrgii.baihongyu.com/

你可能感兴趣的文章
设计模式六大原则(6):开闭原则
查看>>
阿里面试总结--JAVA
查看>>
Servlet的生命周期
查看>>
JAVA八大经典书籍,你看过几本?
查看>>
《读书笔记》—–书单推荐
查看>>
【设计模式】—-(2)工厂方法模式(创建型)
查看>>
有return的情况下try catch finally的执行顺序(最有说服力的总结)
查看>>
String s1 = new String("abc"); String s2 = ("abc");
查看>>
JAVA数据类型
查看>>
浅谈try catch finally
查看>>
JAVA Object类的方法
查看>>
Xshell 4 入门
查看>>
SoapUI-入门
查看>>
Oracle -常用命令
查看>>
Velocity 入门
查看>>
十大算法—-浅谈
查看>>
将Excel中的数据转换成sql Insert语句
查看>>
JAVA技术简称
查看>>
ORACLE模糊查询优化浅谈
查看>>
关于ORACLE查询列加()or () 报ORA-00923:未找找到要求的FROM关键字
查看>>