天天看点

在python中使用epoll

最近在编写python socket程序的时候,师弟推荐了python的epoll调用,现将学习的东西总结如下:

异步socket的益处和linux epoll

通常情况下,我们使用的是阻塞的socket,这个就需要一个线程(或者一个复杂的进程)去执行在每个socket上面的通信工作。主程序线程包含服务器监听套接字接受来自客户端的连接请求并一次接受一个连接,并将新创建的socket传递给一个不同的线程以与客户端进行交互。

但是这个模型有以下的问题:

1.当共享资源的时候,很难保证这些线程正确的协同工作

2.当仅仅只有一个CPU的时候这种编程方式可能效率很低

异步socket可以很好的解决这个问题。这些socket并不因为等某些事件而阻塞。相反的,程序在一个异步的socket上面执行一个动作,并且被立即通知这个动作成功与否。这个信息允许程序去决定如何继续运行。由于异步socket是非阻塞的,就没有必要使用多线程执行了。所有的工作可以在单线程中被完成。虽然这个单线程模型有它自己的问题,但是对于很多程序来说是一个比较好的选择了。它同样与多线程结合起来:单线程异步socket可以作为服务器的网络部件,然后普通的线程可以被用来存取阻塞的资源,比如数据库。

python API 用来处理异步socket:select,poll 和 epoll

poll和epoll比select较好,因为python不需要检查每个socket来查看某些事件是否发生,相反,它们基于操作系统来告诉哪一socket可能有这些事件。

epoll比poll性能更好,因为它并不要求操作系统为python程序要求的查询去检查每一个socket。相反的,Linux 追踪这些事件的发生,并在python程序查询的时候返回一个列表。

性能考虑:

Listent Backlog Queue Size 

这个参数表明在python程序接受之前,有多少TCP/IP连接可以被操作系统接收并被放在backlog queue 

使用ab(apache HTTP server benchmark tool)可以执行负载测试.测试表明,backlog value值小于50会造成性能下降

TCP选项:

TCP_CORK:可以用来囤积信息直到它们准备被发送。这个参数对于使用HTTP/1.1 pipelining的HTTP服务器来说很有用。

TCP_NODELAY

更详细的epoll使用方法可见:

http://scotdoyle.com/python-epoll-howto.html#async-benefits

转载于:https://www.cnblogs.com/zhangzhang/archive/2012/02/11/2319758.html