设为首页 收藏本站
查看: 727|回复: 0

[经验分享] python 关于epoll的学习

[复制链接]

尚未签到

发表于 2018-8-6 11:46:47 | 显示全部楼层 |阅读模式
#!/usr/bin/env python  
# -*- coding: utf-8 -*-
  
import socket, select
  
import Queue,os
  

  
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  
server_address = ("", 8999)
  
serversocket.bind(server_address)
  
serversocket.listen(1)
  
print  "服务器启动成功,监听IP:" , server_address
  
serversocket.setblocking(0)   #设置成非阻塞时间
  
timeout = 10
  
#新建epoll事件对象,后续要监控的事件添加到其中
  
epoll = select.epoll()
  
#注册服务器监听fd到等待读事件集合
  
epoll.register(serversocket.fileno(), select.EPOLLIN)
  
message_queues = {}
  

  
fd_to_socket = {serversocket.fileno():serversocket,}
  
while True:
  
#  print "等待活动连接......"
  
  #轮询注册的事件集合
  
  events = epoll.poll(timeout)
  
#  if not events:
  
#     print "epoll超时无活动连接,重新轮询......"
  
#     continue
  
#  print "有" , len(events), "个新事件,开始处理......"
  
  for fd, event in events:
  
     socket = fd_to_socket[fd]
  
     #可读事件
  
     if event & select.EPOLLIN:
  
         #如果活动socket为服务器所监听,有新连接
  
         if socket == serversocket:
  
            connection, address = serversocket.accept()
  
            print "新连接:" , address
  
            connection.setblocking(0)
  
            #注册新连接fd到待读事件集合
  
            epoll.register(connection.fileno(), select.EPOLLIN)
  
            fd_to_socket[connection.fileno()] = connection
  
            message_queues[connection]  = Queue.Queue()
  
         #否则为客户端发送的数据
  
         else:
  
            data = socket.recv(1024)
  
            if data:
  
               print "收到数据:" , data , "客户端:" , socket.getpeername()
  
               message_queues[socket].put(data)
  
               #修改读取到消息的连接到等待写事件集合
  
               epoll.modify(fd, select.EPOLLOUT)
  
     #可写事件
  
     elif event & select.EPOLLOUT:
  
        try:
  
           msg = message_queues[socket].get_nowait()
  
           xiaoluo = os.popen(msg).read()
  
        except Queue.Empty:
  
           print socket.getpeername() , " queue empty"
  
           epoll.modify(fd, select.EPOLLIN)
  
        else :
  
           print "发送数据:" , data , "客户端:" , socket.getpeername()
  
           socket.send(xiaoluo)
  
     #关闭事件
  
     elif event & select.EPOLLHUP:
  
        epoll.unregister(fd)
  
        fd_to_socket[fd].close()
  
        del fd_to_socket[fd]
  
epoll.unregister(serversocket.fileno())
  
epoll.close()
  
serversocket.close()

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-547587-1-1.html 上篇帖子: Python VS Matlab 下篇帖子: 送给Python路途中迷茫的你们
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表