应用Python快速实现系统原型
[摘要] 快速原型是在开发真实系统之前,构造一个原型,在该原型的基础上,逐渐完成整个系统的开发工作。Python非常易于使用,并且支持Windows/Mac/Unix/Linux/Solaris多操作系统平台,可以帮助开发人员在这些平台上更迅速地完成任务。同时Python拥有一个强大的基本类库和数量众多的第三方扩展库,所以它的应用范围也比较广泛。文章举例说明,如何应用Python快速实现一个异步多线程的前置机系统。
[关键词] 动态编程语言 快速原型开发 前置机 模拟系统
一、系统背景
在开发跨平台业务系统的时候,为了确保后台服务器的数据安全,客户端通常是与交易前置机通讯,发送交易请求,交易前置机接收交易请求,然后与后台服务器交互,从后台获得该交易的返回数据后,再按照交易报文的格式返回给客户端。
交易前置机所使用的操作系统情况较复杂,一般要根据客户单位的具体情况,有些采用Windows系统,有些采用Unix/Linux或者Solaris系统。但在去客户单位进行项目实施之前,开发人员需要在开发过程中随时进行客户端交易的调试工作,这就需要有个模拟交易前置机的系统,在调试过程中能非常方便的修改交易报文的定义,模拟后台返回的交易报文。在某些系统的开发中,这个模拟系统就可以作为一个完整系统的原型,开发系统的过程,就是在此原型基础上,逐渐完善交易类型与交易返回数据,最后完成整个系统的开发。
模拟系统的开发可以用多种方法来实现,而动态语言Python易于使用、类库丰富、修改方便。本文要阐述的是利用Python来进行模拟系统的开发,快速实现交易前置机最常用的功能:接收交易请求、组织返回数据、发送返回数据。
二、 Python的异步(非阻塞)通讯
asyncore库是python的一个标准库,它是一个异步socket的包装。我们在进行网络通讯的时候可以直接使用socket等底层的库,但是asyncore使得我们可以更加方便的进行网络通讯,避免直接使用socket,select,poll等工具时需要面对的复杂处理。
asyncore库很简单,只包含了一个loop()函数和一个dispatcher基类。每一个从dispatcher继承的类的对象,都可以看作我们需要处理的一个socket,可以是TCP连接或者UDP。
asyncore库使用容易,我们只需要定义一个类,它继承dispatcher,然后我们重写(覆盖)一些方法就可以了。我们需要重写的方法一般都以handle_打头的。
loop()函数负责检测一个字典,字典中保存dispatcher的实例,这个字典被称为channel。每次创建一个dispatcher对象,都会把自己加入到一个默认的字典里面去。当对象被加入到channel中的时候,socket的行为都已经被定义好,程序只需要调用loop(),异步多线程通讯功能就准备好了。
三、 专注于业务处理
在我们的模拟系统中,由于需要同时为多个客户端服务,定义了一个主通讯服务类,继承自asyncore.dispatcher类,重写该类的handle_accept方法,从这里获得客户端的连接,向控制台输出客户端IP与端口信息,并转发给处理线程类。
处理线程类继承自asyncore.dispatcher_with_send,此类可以接收和发送数据,只需要重写handle_read方法即可。
这样,一个异步多线程的交易模拟系统就可以运行了。
每当客户端有数据发送过来,就会触发handle_read方法。在此方法中,可以对交易数据进行合法性判断、提取交易类别、提取交易数据、组织交易返回数据、发送数据到客户端,通过这一系列的处理,一个交易的完整过程就完成了。
在这里,通过对交易类别的判断,可以很容易的增加新的交易。