返回顶部
首页 > 资讯 > 后端开发 > Python >python 关于epoll的学习
  • 277
分享到

python 关于epoll的学习

pythonepoll 2023-01-31 07:01:27 277人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

      在linux中,默认情况下所有的Socket都是blocking;当 用户进程调用了recvfrom这个系统调用,kernel就开始了io的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比

      在linux中,默认情况下所有的Socket都是blocking;当 用户进程调用了recvfrom这个系统调用,kernel就开始了io的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这个时候kernel就要等待足够的数据到来。而在用户进程这边,整 个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除 block的状态,重新运行起来。
    所以,blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。

    几乎所有的程序员第一次接触到的网络编程都是从listen()、send()、recv() 等接口开始的,这些接口都是阻塞型的。使用这些接口可以很方便的构建服务器/客户机的模型。

    在python socket模型当中,当使用socket初次编程的时候都会遇到一个阻塞问题;当一个socet的server被一个client暂用之后;参数了阻塞,新的连接是不能进来的,当然还有一个封装的socketserver利用多线程很好的解决了这个问题;但是我们思考一个问题,就是当连接数很多时候很多的线程是否对我们系统照成影响呢,当然可以通过线程池来解决这个问题,但是瓶颈也会产生。

    下面学习用epoll的方式来进行网络编程,当然对比与select只能打开1024(可以调整,但是文件描述符多了性能会下降)epoll的优势就非常明显了。

   代码:

#!/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()

这样就实现了无阻塞的io SOcket模型:

可以参考老外写的文章:

Http://scotdoyle.com/python-epoll-howto.html


--结束END--

本文标题: python 关于epoll的学习

本文链接: https://lsjlt.com/news/190893.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python 关于epoll的学习
          在linux中,默认情况下所有的socket都是blocking;当 用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:准备数据。对于network io来说,很多时候数据在一开始还没有到达(比...
    99+
    2023-01-31
    python epoll
  • 关于JAVA8的 Stream学习
    目录一、Stream的使用1 创建2 步骤二、Stream的特性三、中间操作1 filter()2 limit()3 skip()4 map()3.1 flatM...
    99+
    2024-04-02
  • [Python学习25] 关于函数更多的
    在这一章的学习中,做了一些函数和变量的练习。并不是直接运行脚本,而是在脚本中定义了一些函数,把他们导入到Python中通过执行函数的方式运行。先看代码: def break_words(stuff): """This functio...
    99+
    2023-01-31
    函数 更多 Python
  • 关于MySQL8的WITH查询学习
    目录前言示例练习总结 前言 对于逻辑复杂的sql,with可以大大减少临时表的数量,提升代码的可读性、可维护性 MySQL 8.0终于开始支持with语句了,对于复杂查询,可以不用写那么多的临时表了。 可以查看官方文档【点击跳转】 示...
    99+
    2021-11-25
    关于MySQL8的WITH查询学习
  • 关于slf4j_log4j2源码学习心得
    目录日志工厂获取Logger日志输出Logger.info异步日志写入异步日志上下文选择locateContext定位选择日志上下文总结日志工厂获取Logger 获取日志工厂_ge...
    99+
    2024-04-02
  • 基于Python的EasyGUI学习实践
    01_msgbox # 使用easygui功能,可以直接导入easygui模块 import easygui # 需要弹框时,要使用easygui。 # msgbox(m)方法,输出带有m内容的信息框。 # m...
    99+
    2022-06-02
    Python EasyGUI
  • Python深度学习 深度学习入门基于
    《Python深度学习》由Keras之父、现任Google人工智能研究员的弗朗索瓦•肖莱(François Chollet)执笔,详尽介绍了用Python和Keras进行深度学习的探索实践,涉及计算机视觉、自然语言处理、生成式模型等应用。书...
    99+
    2023-01-31
    深度 入门 Python
  • python入门学习关于for else的特殊特性讲解
    目录For-Else 特性的基础知识使用 For-Else 特性的三个场景1. 迭代并查找没有标志变量的项2. 帮助打破嵌套循环3. 帮助处理异常总结不管我们使用哪种编程语言,我们都...
    99+
    2024-04-02
  • 关于golang中死锁的思考与学习
    目录1、Golang中死锁的触发条件1.1 书上关于死锁的四个必要条件的讲解1.2 Golang 死锁的触发条件1.3 golang 中阻塞的场景2、死锁案例讲解2.1 案例一:空 ...
    99+
    2023-03-19
    golang 死锁
  • python学习第一天关于编程介绍和计算
    1.什么是编程语言? 首先是什么语言?语言是一个事物与另外一个事物沟通的介质 那么编程语言是人与计算机之间沟通的介质 2什么是编程(what) 编程就是程序员自己想做的事情让计算机去做的过程 百度:为了使计算机能够理解人的意图,人类就必...
    99+
    2023-01-30
    python
  • 关于Javascript中值得学习的特性总结
    目录可选链操作符(Optional Chaining Operator)空值合并运算符(Nullish Coalescing Operator)Promise.allSettled(...
    99+
    2023-05-19
    Javascript特性
  • 关于keras中卷积层Conv2D的学习记录
    目录keras中卷积层Conv2D的学习参数keras中conv2d,conv2dTranspose的Padding详解conv2D演示代码Conv2d演示结论CONV2Dtrans...
    99+
    2023-02-21
    keras卷积层Conv2D keras卷积层 卷积层Conv2D
  • Python于你于他,只差个学习方法
    很多人都在说python简单,容易掌握,真的就那么简单么?在很多网站上都会看到这样一个疑问:为什么他们都说python很简单,自己却觉得很难?今天,就跟源码时代的小编一起来探讨一下吧。许许多多的朋友在学习python的时候都会有这样的经历:...
    99+
    2023-01-31
    学习方法 于你 只差
  • 字字谏言!Python入门学习教程:关于Python不得不说的事儿
    作为程序员,你肯定遇到过这样的领导:“别人还没走,你先走了不合适吧。”“不能确定功劳,总得有苦劳吧!你看别人9点谁走了?”说到996,这很有可能是诱因之一。所以很多程序员会在学习了Java、C的情况下,依然转头Python的怀抱。提升工作效...
    99+
    2023-06-02
  • 关于MongoDB数据库学习路线指南
    学习路线 1、MongoDB数据库学习大纲 2、MongoDB数据格式 3、MongoDB数据库特点 4、MongoDB数据库应用场景 5、MongoDB数据库单节点部署 6、MongoDB数据库常用操作指令 ...
    99+
    2023-04-12
    MongoDB数据库 MongoDB学习路线
  • java学习笔记_关于字符串概述
    一、String类String类代表字符串,是由字符构成的一个序列。创建String对象的方法很简单,有以下几种:1)用new来创建:String s1 = new String("my name is tongye");...
    99+
    2023-05-31
    java 字符串 ava
  • Python 实时学习笔记:路径设置是学习的关键吗?
    Python 是一种灵活的编程语言,它能够在各种不同的平台上运行。它具有简洁的语法,易于学习和使用。但是对于初学者来说,路径设置可能会成为一个困扰他们的问题。在本文中,我们将探讨路径设置在 Python 学习中的重要性,并提供一些示例代码...
    99+
    2023-11-01
    实时 学习笔记 path
  • Python面向对象编程中关于类和方法的学习笔记
    类和实例 python是一个面向对象的语言,而面向对象最重要的概念就是类和实例, 记得刚学习的时候不太理解这些概念,直到老师说了一句”物以类聚”. 没错就是类, 归类 物以类聚 类其实就是把一些相同特性的事...
    99+
    2022-06-04
    面向对象 学习笔记 方法
  • linux对于UDP的学习
    目录一、UDP、linux基础介绍二、对于各函数使用1、对于socket函数的使用2、 对于bind函数的使用3、 对于recvfrom函数的使用4、 对于sendto函数的使用三、 扩展知识1、 netstat2、...
    99+
    2022-06-03
    Linux UDP
  • vue2.x的深入学习--关于h函数的说明
    目录解决方案,总结:vue项目中。写在.vue文件的template里的代码需要借助webpack的模板解析器插件才能解析。单个.html文件引入vue文件时,该vue文件顺便把模板...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作