1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 【Python】单线程异步多线程多进程实例

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

时间:2020-01-29 22:22:44

相关推荐

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

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

这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有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,运行截图:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。