AP计算机科学A(APcomputer science A)复习备考攻略视频教程
43780 人在学
现于今,并发编程已经成为了程序猿的必备技能,在Python中,程序猿想要实现并发编程有很多方法,最常用的就是多进程方式和多线程方式,当然,除了这两种方法,还有一些别的方法来实现并发编程,小编就跟大家介绍这两种方法之外的并发方式——远程分主机和伪线程。
远程分布式主机
伴随着大数据时代的来临,单台计算机系统的数据计算和处理需要分布式计算机网络来运行,同时运行多台主机节点的程序并行运行已成为当前软件体系结构必须考虑的问题。
在远程主机之间进行进程间通信有几种常见方法。
TCP/IP协议
TCP/IP是所有远程通信的基础,但是API级别较低,使用起来比较麻烦,所以一般不考虑。
Remote Function Call的远程方法调用。
RPC是远程进程间通信的早期手段。在Python下有一个开源的RPyC实现。
Remote Object远程对象。
Remote Objects是一个高级封装,程序可以像操作本地对象那样操作本地的远程对象代理。CORBA规范中最常用的远程对象规范是CORBA,CORBA的最大优点是可以在不同语言和平台中通信。对于未使用的语言和平台,有一些各自的远程对象实现,比如Java的RMI、MS的DCOM。
Python的开放源码实现有很多远程对象支持。
Dopy
Fnorb
ICE
omniORB
Pyro
YAMI
消息队列Message Queue。
消息队列是比RPC或远程对象更灵活的通信方式,通常支持Python接口的消息机制有。
RabbitMQ
ZeroMQ
Kafka
AWS+BOTO
对远程主机执行并发和本地多进程没有很大的不同,这一切都需要解决进程间通信问题。远程进程的管理和协调当然要比本地复杂。
在Python下,有很多开放源码框架,它们提供了有效的管理方法,包括:
Celery
Celery是一个非常成熟的Python分布式框架,它可以在分布式系统中异步地执行任务,并提供有效的管理和调度功能。参照这里
SCOOP
SCOOP提供简单易用的分布式调用接口,通过Future接口实现并发。
Dispy
Dispy比Celery和SCOOP更轻量地提供分布式并行服务。
PP
PP是Python并行服务的轻量级,参考这里。
Asyncoro
Asyncoro是另一种Python框架,它使用Generator实现分布式并发,
当然还有很多其他的系统,我没有一一列出。
此外,很多分布式系统都为Spark等Python接口提供支持。
伪线程
此外,还有一种很少见的并发方法,我们可以称之为伪线程,即它看起来像线程,使用的接口类似线程接口,但实际使用非线程的方式,相应的线程开销也不存在。
eventlet
greenlet提供了轻量级的coroutines来支持并发进程。
greenlet是Stackless的副产品,它使用tasklet来支持一种名为mirco-thread的技术,这里有一个使用greenlet的伪线程示例。
通过运行上述程序获得如下结果:
伪线程gr1switch输出12,然后调用gr2switch得到56,switch返回到gr1,打印34,伪线程gr1结束,程序退出,因此78永远不会打印。从这个例子中我们可以看到,利用伪线程,我们可以有效地控制程序的执行流程,但伪线程并不存在真正意义上的并发。
eventlet、gevent和concurence在greenlet的基础上提供并发。
eventlet http://eventlet.net/
eventlet是一个Python库,它提供了网络调用并发性,使用者可以非阻塞地调用阻塞IO操作。
实施结果如下。
eventlet为支持generator的操作而修改了urllib2,接口与urllib2一致。GreenPool和Python的Pool界面在这里是一致的。
gevent
gevent和eventlet相似,关于它们的区别可以在本文中找到。
实施的成果是:
['206.169.145.226', '93.184.216.34', '23.235.39.223']
concurence https://github.com/concurrence/concurrence
concurence是另一个使用greenlet来提供网络并发的开源库,我没有使用过,大家可以自己试试。
小编介绍的这两种并发方式你学会了吗?掌握了这两种方法,以后进行Python并发编程就有了更多的选择了哟,也能够面对更多的编程场面,这两种方式是很值得我们学习的。
>>>>>>点击进入Python专题