python的epoll及EPOLLLT

今天没事练习python的epoll,一开始写了个客户端:

#! /usr/python

import socket,sys,select

c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = ‘127.0.0.1‘
port=57777
c.connect((host,port))

epoll_fd = select.epoll()

epoll_fd.register(c.fileno(),select.EPOLLIN)
epoll_fd.register(sys.stdin.fileno(), select.EPOLLIN)
str=""
while True:
    e_list = epoll_fd.poll()
    for fd,events in e_list:
      if fd == c.fileno() and events&select.EPOLLIN:
        buf =  c.recv(1024)
        if not len(buf):
           break
        print "ser:",buf
      if fd == c.fileno() and events & select.EPOLLOUT:
        #print ‘send msg to ser.‘
        c.send(str)
        epoll_fd.modify(c.fileno(), select.EPOLLIN)
      if fd == sys.stdin.fileno() and events & select.EPOLLIN:
        str="ssf"
        epoll_fd.modify(c.fileno(), select.EPOLLOUT)

c.close()

发现服务端总是进入死循环收信息,甚是迷惑。后来修改了 str="ssf"处,修改为raw_input,发现程序正常运行,恍然醒悟,epoll默认

是LT模式,缓冲里的数据没读走,是每次都会触发的,因此,上面的代码修改epoll_fd.register(sys.stdin.fileno(), select.EPOLLIN)

为epoll_fd.register(sys.stdin.fileno(), select.EPOLLIN|select.EPOLLOUT) 也是能正常工作的。

附上最终代码:

client.py

#! /usr/python

import socket,sys,select

c=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
host = ‘127.0.0.1‘
port=57777
c.connect((host,port))

epoll_fd = select.epoll()

epoll_fd.register(c.fileno(),select.EPOLLIN)
epoll_fd.register(sys.stdin.fileno(), select.EPOLLIN)
str=""
while True:
    e_list = epoll_fd.poll()
    for fd,events in e_list:
      if fd == c.fileno() and events&select.EPOLLIN:
        buf =  c.recv(1024)
        if not len(buf):
           break
        print "ser:",buf
      if fd == c.fileno() and events & select.EPOLLOUT:
        #print ‘send msg to ser.‘
        c.send(str)
        epoll_fd.modify(c.fileno(), select.EPOLLIN)
      if fd == sys.stdin.fileno() and events & select.EPOLLIN:
        str=raw_input("me: ")
        epoll_fd.modify(c.fileno(), select.EPOLLOUT)

c.close()

简单的server和client相似

import socket, os,select,sys

host=‘127.0.0.1‘
port=57777

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((host,port))
s.listen(10)

epoll_obj=select.epoll()

epoll_obj.register(sys.stdin.fileno(), select.EPOLLIN)

print ‘wait for connect‘

cs,caddr=s.accept()
epoll_obj.register(cs.fileno(), select.EPOLLIN)
str=""
while 1:
    readylist = epoll_obj.poll()
    for fd,event in readylist:
        if fd == cs.fileno() and event & select.EPOLLIN:
            buf = cs.recv(128)
            if not len(buf):
                cs.close()
                break
            print "cli: ", buf

        if fd == cs.fileno() and event & select.EPOLLOUT:
            cs.send(str)
            epoll_obj.modify(cs.fileno(), select.EPOLLIN)

        if fd == sys.stdin.fileno() and event&select.EPOLLIN:
            str=raw_input("me:")
            epoll_obj.modify(cs.fileno(), select.EPOLLOUT)
时间: 2024-11-15 07:37:55

python的epoll及EPOLLLT的相关文章

python之epoll服务器源码分析

#!/usr/bin/env python # -*- coding: utf8 -*- import socket, select EOL1 = b'/r/n' EOL2 = b'/r/n/r/n' # 拼接成的response response = b'HTTP/1.0 200 OK/r/nDate: Mon, 1 Jan 1996 01:01:01 GMT/r/n' response += b'Content-Type: text/plain/r/nContent-Length: 13/r

练习PYTHON之EPOLL

哟,哟,哟,,SELECT,EPOLL之类的,终于出现了. 不能太急了,要缓一缓,缓一缓,再缓一缓~~~~~~~~~ http://scotdoyle.com/python-epoll-howto.html import socket EOL1 = b'\n\n' EOL2 = b'\n\r\n' response = b'HTTP/1.0 200 OK\r\nDate: Mon, 1 Jan 1996 01:01:01 GMT\r\n' response += b'Content-Type:

python 使用epoll异步处理多个客户端的连接

服务器端: #-*- coding:utf8 -*- import socket import select import os address = "0.0.0.0" port = 10001 sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM) def main(): global address,port,sock epoll = select.epoll() #获取创建好的sock的文件描述符 fd = sock.fil

linux下select/poll/epoll机制的比较

select.poll.epoll简介 epoll跟select都能提供多路I/O复用的解决方案.在现在的Linux内核里有都能够支持,其中epoll是Linux所特有,而select则应该是POSIX所规定,一般操作系统均有实现 select: select本质上是通过设置或者检查存放fd标志位的数据结构来进行下一步处理.这样所带来的缺点是: 1. 单个进程可监视的fd数量被限制,即能监听端口的大小有限. 一般来说这个数目和系统内存关系很大,具体数目可以cat /proc/sys/fs/fil

epoll和poll、select的区别

http://blog.csdn.net/jnu_simba/article/details/12523175 二.epoll与select.poll区别 1.相比于select与poll,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率.内核中的select与poll的实现是采用轮询来处理的,轮询的fd数目越多,自然耗时越多. 2.epoll的实现是基于回调的,如果fd有期望的事件发生就通过回调函数将其加入epoll就绪队列中,也就是说它只关心"活跃"的fd,与fd数目

epoll 水平触发和边缘触发的区别

EPOLLLT——水平触发EPOLLET——边缘触发 epoll有EPOLLLT和EPOLLET两种触发模式,LT是默认的模式,ET是“高速”模式.LT模式下,只要这个fd还有数据可读,每次 epoll_wait都会返回它的事件,提醒用户程序去操作,而在ET(边缘触发)模式中,它只会提示一次,直到下次再有数据流入之前都不会再提示了,无 论fd中是否还有数据可读.所以在ET模式下,read一个fd的时候一定要把它的buffer读光,也就是说一直读到read的返回值小于请求值,或者 遇到EAGAIN

IO多路复用select、poll、epoll的区别

(1)select==>时间复杂度O(n) 它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作.所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长. (2)poll==>时间复杂度O(n) poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的

mosquitto在Linux环境下的部署/安装/使用/测试

mosquitto在Linux环境下的部署 看了有三四天的的源码,(当然没怎么好好看了),突然发现对mosquitto的源码有了一点点感觉,于是在第五天决定在Linux环境下部署mosquitto. 使用传统源码安装步骤: 步骤1:http://mosquitto.org/files/source/官网下载源码,放到Linux环境中.解压后,找到主要配置文件config.mk,其中包含mosquitto的安装选项,需要注意的是,默认情况下mosquitto的安装需要OpenSSL(一个强大的安全

转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】

下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架,底层在linux基于最新的epoll实现,为了更好的使用,了解其底层原理还是有必要的.下面记录下分别基于Select/Poll/Epoll的echo server实现.Python Select Server,可监控事件数量有限制: 1 2 3 4 5 6 7 8 9 10 11 12 13 14