Python封装IOCP

13 篇文章 1 订阅
4 篇文章 0 订阅

    2011-07-22:源码下载:http://blog.csdn.net/jgood/article/details/6626872

    Python是一门简洁而优雅的语言,她的高生产率使我们能用最少的人力、物力、时间、财力代价解决眼前的问题。但是当解决了眼前的问题,一些更长远的问题就不得不考虑。

    利用Python自带的socket模块写网络服务器程序,很难能够承受上千个连接。我曾经参考赖勇浩同学的NetStream模块,使用Python自带的socket模块来编写通信模型,但实际的效果并不是很好,当连接数量达到800个左右的时候,cpu资源占用率就达70%-80%。当然可能是我写的代码质量比较差。Darkspy是高手,它自己封装的通信模型能够达到非常高的效率,可是我远没有达到他那样的水平。赖勇浩同学给我的意见是:在windows平台下要创建高性能的网络通信平台,最好使用IOCP。于是乎,这几天一直在尝试用Python来封装Iocp。

    Python本身是用C语言实现的,对c/c++的嵌入式扩展支持非常好,c/c++的代码只要简单的封装就可以被python调用,反之亦然。所以,使用c/c++来封装Iocp,然后用Python来调用,应该是个不错的解决方案。

    网上关于IOCP的资料非常多, 现成的代码也随处可见。别看它只要用两三个windows api函数就可以实现,但真正要理解IOCP、理解windows的重叠IO模型,还是要花费一般周折的。我花了大量的时间学习windows的重叠IO模型,参考网上的一些例子,用c++代码写出最简单的例子,然后用Python对其进行封装。对于windows重叠IO模型、IOCP的理解,我还是比较模糊,在接下来的一段时间里要好好消化。

    使用IOCP完成底层客户端socket的连接/断开、数据收发。将IOCP接收到的数据交给Python处理,Python处理完成后,再通过IOCP将数据发回客户端。大概的流程如下:ActivityDiagram1

    在我封装的IOCP模块中, 只提供了五个方法:

PyIocp.start(port, max_conn_count, buffer_size)

    该方法用于启动监听。参数port是监听的端口号;max_conn_count表示最大允许的连接数;buffer_size用于指定低层收发数据的缓冲区大小。如果函数启动成功,返回0。

PyIocp.stop()

    stop方法用于关闭监听。

PyIocp.recv()

    recv()方法返回接收到的数据。这里的数据,不单指socket发送/接收的数据,对于连接创建、连接断开,也是以数据的形式提供给Python的。可以根据返回的元组的第一个元素来判断数据的类型。例如:如果用户连接上服务器,那么通过调用recv()返回一个三元元组:(1, socket_id, “ip:port”);当用户断开连接时,返回(2, socket_id, “”);当接收到数据时,返回(4, socket_id, ‘这里是数据’); 如果当前没有数据,调用recv()方法将返回(0, 0XFFFFFFFF, “”)。

PyIocp.send(socket_id, data)

    send()方法用于发送数据。如果调用成功,返回发送数据的长度。如果操作失败,返回一个小于0的值。

PyIocp.close(socket_id)

    close()方法用于关闭指定连接。

    我用这个封装Iocp的模块写了一个简单的echo服务器来测试性能,当连接上4000个客户端,并进行大量数据通信的时候,系统的资源占用量在20%左右。虽然这与网上关于Iocp高性能的指标还有差距。

    让网络通信不再成为Python服务器的性能瓶颈,这就是我要达到的目的。嘻嘻~~ 非常感谢Darkspy,赖勇浩两位同学给我的意见和帮助。

 

    暂时不提供源码下载,有需要的同学,可以留言留下邮件。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值