原文地址:http://scotdoyle.com/python-epoll-howto.html

介绍

Python已于2.6版本添加访问Linux epoll库的API。这篇教程使用Python 3简要介绍如何使用Linux epoll。

阻塞Socket

例1是一个Pyhton服务端程序,它监听8080端口,接收HTTP请求并将其打印到console,然后对HTTP请求进行回复。

#Example 1

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: text/plain\r\nContent-Length: 13\r\n\r\n'

response += b'Hello, world!'

#创建socket

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

serversocket.bind(('0.0.0.0', 8080))

serversocket.listen(1)

connectiontoclient, address = serversocket.accept()

request = b''

while EOL1 not in request and EOL2 not in request:

request += connectiontoclient.recv(1024)

print(request.decode())

connectiontoclient.send(response)

connectiontoclient.close()

serversocket.close()

下面的代码添加了一个循环,不断接收客户端的请求直到被我们手动关闭。例2更清楚地展示了服务端创建的socket不直接与客户端进行数据交换,而是服务端socket接收到来自客户端的连接后,创建一个新的socket与该客户端进行通信。

#Example 2

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: text/plain\r\nContent-Length: 13\r\n\r\n'

response += b'Hello, world!'

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

serversocket.bind(('0.0.0.0', 8080))

serversocket.listen(1)

try:

while True:

connectiontoclient, address = serversocket.accept()

request = b''

while EOL1 not in request and EOL2 not in request:

request += connectiontoclient.recv(1024)

print('-'*40 + '\n' + request.decode()[:-2])

connectiontoclient.send(response)

connectiontoclient.close()

#确保程序即使出现exception,socket也会被关闭

finally:

serversocket.close()

非阻塞Socket和Linux epoll的好处

上面两个例子展示的都是阻塞socket。Python代码执行到某行会停在那里直到某一事件发生。如16行的accept()会被阻塞直到有一个客户端请求连接。19行的recv()会被阻塞直到客户端发送了数据(或没有数据可读取)。21行的send()会被阻塞直到所有要发送给客户端的数据已经Linux被放入了传输队列。

当一个服务端程序使用阻塞socket时,对于每一个客户端,其经常使用一个线程甚至一个专门的进程进行通讯。服务端程序的主线程则主要包括监听的被用来接受客户端请求的socket。其每次接收一个来自客户端的请求,并把新创建的用于和客户端通信的socket传给另外一个线程与客户端进行交互。因为每个线程只与一个客户端进行通讯,某一个线程出现阻塞不会影响到其他线程执行的任务。

使用多线程和阻塞socket进行网络编程写出的代码更加直观、简单,但是有不少缺点。多线程需要考虑到操作系统关于资源共享的常见问题,并且这种编程方式对单核CPU很不友好。

The C10K Problem讨论了若干种处理并发连接的方法,比如使用异步socket。

python网络编程linux pdf_Python网络编程:Linux epoll相关推荐

  1. python面向对象编程实例pdf_Python面向对象编程指南 ([美]StevenFLott洛特) 中文pdf扫描版[52MB]...

    Python是一种面向对象.解释型的程序设计语言,它已经被成功应用于科学计算.数据分析以及游戏开发等诸多领域. Python面向对象编程指南深入介绍Python语言的面向对象特性,全书分3个部分共18 ...

  2. IT视频课程集(包含各类Oracle、DB2、Linux、Mysql、Nosql、Hadoop、BI、云计算、编程开发、网络、大数据、虚拟化

    马哥Linux培训视频课程:http://pan.baidu.com/s/1pJwk7dp Oracle.大数据系列课程:http://pan.baidu.com/s/1bnng3yZ 天善智能BI培 ...

  3. Linux下网络编程

    Linux下网络编程初步 Linux以其源代码公开闻名于世,并以其稳定性和可靠性雄霸操作系统领域,在网络应用技术方面使用得更加广泛.很久以来它就是Windows的重要对手之一.随着网络时代的来临,Li ...

  4. 【Linux网络编程】TCP网络编程中connect listen和accept三者之间的关系

    00. 目录 文章目录 00. 目录 01. TCP服务端和客户端流程 02. connect函数 03. listen函数 04. 三次握手 05. accept函数 06. 附录 01. TCP服 ...

  5. 【Linux网络编程】TCP网络编程中connect()、listen()和accept()三者之间的关系

    基于 TCP 的网络编程开发分为服务器端和客户端两部分,常见的核心步骤和流程如下: connect()函数 对于客户端的 connect() 函数,该函数的功能为客户端主动连接服务器,建立连接是通过三 ...

  6. Linux底层网络编程--ARP,PING等

    一linux系统中获取网卡信息 获取网卡信息有两种方法.一种是读取系统文件.另外一种是通过系统API进行获取. 1.  读取系统文件 程序中通过读取/proc/net/dev文件即可以读取到系统中的所 ...

  7. Linux网络编程---I/O复用模型之epoll

    https://blog.csdn.net/men_wen/article/details/53456474 Linux网络编程-I/O复用模型之epoll 1. epoll模型简介 epoll是Li ...

  8. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...

    RT,使用消息队列,信号量和命名管道实现的多人群聊系统. 本学期Linux.unix网络编程的第三个作业. 先上实验要求: 实验三  多进程服务器 [实验目的] 1.熟练掌握进程的创建与终止方法: 2 ...

  9. Linux C高级编程——网络编程之API(5)

    Linux C网络编程--API 宗旨:技术的学习是有限的,分享的精神的无限的.          一.基本socket函数 Linux系统是通过提供套接字(socket)来进行网络编程的.网络的so ...

最新文章

  1. CentOS 安装配置memcached
  2. 如果类是个泛型类的话dllImport 代码不能编译
  3. 前1000位粉丝的诞生
  4. Node.js 官方Path模块简介
  5. 领航商务之选——金立M5 plus体验札记
  6. 【Java框架】 Hibernate与Mybatis对比
  7. 回溯算法-排列/组合/子集
  8. php把整数拆分成数组,数组拆分处理(整数时的处理),该怎么处理
  9. python 运算符重载_一锅类似函数重载的小杂烩
  10. 快捷键截屏_win7截图快捷键是什么 win7截图快捷键怎么按
  11. RHEL6网络无人值守安装
  12. 基于遗传算法自动化集装箱码头多载AGV调度(一)—模型搭建
  13. oracle更新字段为null,OracleORA-01451:要修改为NULL的列无法修改为NULL
  14. 计算机软件的制作过程,迅捷流程图制作软件
  15. 求职面试PPT模板推荐
  16. 仿真Windows_XP画图板的java实现
  17. “磁碟机”病毒肆虐 数万电脑中招
  18. Android不同屏幕适配的大神解决方案(转)
  19. android 文件传输_使用“发送到”轻松将文件传输到您的Android设备
  20. 把图片放大后还很清晰的办法

热门文章

  1. 20151217jqueryUI--自动补全工具
  2. JAVA设计模式《四》
  3. PHP spl_autoload_register()函数使用
  4. 使用JAVASCRIPT进行全屏显示页面,就像触摸屏显示效果
  5. WINDOWS蓝色当机画面解读
  6. [参考]查看ORACLE DB信息的一些SQL
  7. 从json数组中获取某一属性的集合
  8. oracle习题-emp表查询练习
  9. (转)Android studio 使用心得(五)—代码混淆和破解apk
  10. 常用的Webserver接口