python的epoll及EPOLLLT
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python的epoll及EPOLLLT,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2610字,纯文字阅读大概需要4分钟。
内容图文
![python的epoll及EPOLLLT](/upload/InfoBanner/zyjiaocheng/1329/6839238552384004accf0192d92c4a85.jpg)
今天没事练习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) ifnot len(buf): breakprint"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) ifnot len(buf): breakprint"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) ifnot len(buf): cs.close() breakprint"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)
原文:http://www.cnblogs.com/lijinping/p/5946190.html
内容总结
以上是互联网集市为您收集整理的python的epoll及EPOLLLT全部内容,希望文章能够帮你解决python的epoll及EPOLLLT所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。