python iocp_Python封装IOCP | 学步园

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将数据发回客户端。大概的流程如下:

在我封装的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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用IOCP完成端口和Socket封装的异步TCP类是一种成熟的技术,它能够有效地处理大量并发请求,并且能够提高系统的性能和效率。首先,IOCP能够充分利用系统资源,通过将I/O操作交给内核来完成,可以实现高效的异步操作。而端口和Socket封装则可以简化开发者的编程工作,提供更加友好的接口和操作方法,从而提高开发效率和代码的可读性。 此外,使用IOCP完成端口和Socket封装的异步TCP类还具有良好的扩展性和灵活性。通过合理设计类的结构和接口,可以实现类的继承和重载,满足不同应用场景和需求。同时,IOCP完成端口也可以与其他技术和框架结合,如线程池、事件驱动等,从而实现更加强大和复杂的系统功能。 然而,使用IOCP完成端口和Socket封装的异步TCP类也存在一些局限性。比如对于初学者来说,可能需要一定的学习成本,需要掌握一定的操作和调试技巧。同时,如果应用不当,可能会导致系统资源的浪费和性能下降。因此,在使用这种技术时,需要开发者具有一定的经验和技术水平,可以充分发挥其优势,避免其劣势的影响。 总的来说,使用IOCP完成端口和Socket封装的异步TCP类是一种成熟的技术,它具有高效、灵活、可扩展等优势,能够满足大规模并发请求的处理需求,为系统的性能和可靠性提供了良好的支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值