Python并发编程的实际应用

    作者:匿名更新于: 2021-10-25 14:22:54

    大神带你学编程,欢迎选课

      Python的并发编程的实现方式有很多种,主要就是多线程方式,多进程方式,远端分布式主机和伪线程这四种方式,小编在前面的文章里想习的介绍了这四种实现方式的使用方法,现在大家跟随小编一起来看一下Python的并发编程的实际使用情况。

      通常需要用到并发的场合有两种,一种是计算密集型,也就是说你的程序需要大量的CPU资源;另一种是IO密集型,程序可能有大量的读写操作,包括读写文件,收发网络请求等等。

      计算密集型

      针对计算密集度的应用,我们选择了著名的蒙特卡洛算法进行PI计算。其基础如下。 

      在计算圆周率时,蒙特卡洛算法是利用统计原理来模拟圆周率的,即在1/4圆区域内随机点(红点)的概率与其面积成正比。这一概率p=Pi*R*R/4:R*R,其中,R是正方形的边长,圆的半径。根据这一结论,如果我们模拟出圆周率的1/4,那么就可以知道圆周率,如果我们模拟出1/4圆上的点的概率,就可以知道圆周率的概率了,我们可以通过大量的实验,即产生大量的点,来确定点的位置,然后计算出结果。

      其基本算法是:  

     

      此处测试方法要做n个试验,返回1/4圆中点的数目。判别方法是检查这个点到圆心的距离,如果小于R为圆心。

      利用大量并行性,我们可以快速地进行多次测试,测试的次数越多,结果就越接近实际的圆周率。

      在此提供了不同并发方法的程序代码。

      非并发

      首先是单线程,然后该进程运行,查看性能。 

     

      多线程

      要使用线程池,我们使用多线程处理的dummy包,这是一个多线程的封装。请注意,尽管这段代码没有提及线程,但它绝对是多线程。

      经过测试我们满意的发现,果然不出所料,当线程池为1是它运行的结果与没有并发时一样,当我们将线程池数字设置为5时,所需时间大约是没有并发时的2倍,测试数据在5秒到9秒之间。因此,对于计算密集的任务,还是不要使用多线程。  

      多进程

      对于计算密集型的任务,理论上更适合使用多进程并发,在下面的例子中,进程池的规模被设置为5,修改进程池的大小将会对结果产生的影响,当进程池被设置为1时,与多线程的结果所需的时间相似,因为此时并不存在并发;设置为2时,响应时间有了明显的改善,比以前没有并发的一半多;但是继续扩展进程池对性能的影响并不大,甚至有所下降,也许我的AppleAir的CPU只有两个核?  

      请注意,如果您设置了一个非常大的进程池,您会遇到Resourcetemporarilyunavailable的错误,系统无法支持创建太多进程,毕竟资源有限。  

      gevent

      不管是gevent还是eventlet,响应时间和非并发之间的差别不大,这与测试结果一致,因为没有并发。  

      eventlet

      

     

      SCOOP

      SCOOP中的Future接口符合PEP-3148的定义,即Python3中提供的Future接口。

      SCOOP配置环境(单、4个Worker)缺省时,并发性能有所改善,但并发性能有所改善。  

      Celery

      任务代码

     

      客户端代码  

      用Celery做并发测试的结果出人意料,是所有测试用例中最差的,响应时间是没有并发的5~6倍。可能是因为控制协作的开销太大了。Celery可能不是这样的计算任务的一个好选择。

      asyncoro。

      Asyncoro的测试结果与非并发性一致。 

      IO密集型

      IO密集的任务是另一种常见的用例,比如网络WEB服务器就是一个例子,当WEB服务器每秒可以处理多少个请求时,WEB服务器的度量。

      最简单的例子就是阅读网页。 

      由于不同的并发库下的代码,由于它们比较相似,所以我不会一一列出。你可以参考计算密集中的代码做参考。

      实验结果表明,对于IO密集型的任务,使用多线程或多进程,都能有效地提高程序的效率,而伪线程的性能提升则非常显著,eventlet比不使用并发时响应时间从9秒提高到0.03秒。eventlet/gevent提供了很方便的非阻塞异步调用模式。建议在此处使用线程或伪线程值,因为在响应时间类似的情况下,线程和伪线程消耗更少的资源。

      看到了这些不同并发方式的实际使用情况,有没有加强大家对并发编程的理解呢?小编认为一定是有的,祝大家阅读愉快,早日掌握Python的所有并发编程的实现方法。

        >>>>>>点击进入Python专题

课课家教育

未登录