io多路复用,select,笔记
一下代码,是摘自大王的博客,(http://www.cnblogs.com/alex3714/)我自己有加了些注释。
1
2
3 #_*_coding:utf-8_*_
4
5 __author__ = 'Alex Li'
6
7 import select
8 import socket
9 import sys
10 import queue
11
12 # Create a TCP/IP socket
13 server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
14 #创建一个socket,作用和文件描述符差不多(基于linux一切皆文件的哲学思想),recv相当于read(),send相当于write()。默认socket.socket默认就是加socket.AF_INET, socket.SOCK_STREAM这两个参数。
15 server.setblocking(False)
16 #sk.setblocking(bool) 是否阻塞(默认True),如果设置False,那么accept和recv时一旦无数据,则报错。accept和recv默认是阻塞的。
17
18 # Bind the socket to the port
19 server_address = ('localhost', 10000)
20 print(sys.stderr, 'starting up on %s port %s' % server_address)
21 server.bind(server_address)
22
23 # Listen for incoming connections
24 server.listen(5)
25 #理论上监听队列的长度(backlog)就是取listen和maxconn(系统层次的限定值)的最小值()
#如果客户端没有被处理的请求数超过了这个值,或者请求了一个没有侦听的端口就会报(socket.error: [Errno 10061] )
# 5,表示内核已经接到了连接请求,但服务器还没有调用accept进行处理的连接个数最大为5
这个值不能无限大,因为要在内核中维护连接队列
26
27 # Sockets from which we expect to read
28 inputs = [ server ]
29
30 # Sockets to which we expect to write
31 outputs = [ ]
32
33 message_queues = {}
34 while inputs:
35
36 # Wait for at least one of the sockets to be ready for processing
37 print( '\nwaiting for the next event')
38 readable, writable, exceptional = select.select(inputs, outputs, inputs)
39 # Handle inputs
40 for s in readable:
41
42 if s is server:
43 # A "readable" server socket is ready to accept a connection
44 connection, client_address = s.accept()
45 print('new connection from', client_address)
46 connection.setblocking(False)
47 #将这个socket设置成非阻塞的。这个socket的recv和accept就不会阻塞了。
48 inputs.append(connection)
49
50 # Give the connection a queue for data we want to send
51 message_queues[connection] = queue.Queue()
52 #创建一个字典的key和value,value就是一个队列的实例。
53 else:
54 data = s.recv(1024)
55 if data:
56 # A readable client socket has data
57 print(sys.stderr, 'received "%s" from %s' % (data, s.getpeername()) )
58 message_queues[s].put(data)
59 # Add output channel for response
60 if s not in outputs:
61 outputs.append(s)
62 else:
63 # Interpret empty result as closed connection
64 print('closing', client_address, 'after reading no data')
65 # Stop listening for input on the connection
66 if s in outputs:
67 outputs.remove(s) #既然客户端都断开了,我就不用再给它返回数据了,所以这时候如果这个客户端的连接对象还在outputs列表中,就把它删掉
68 inputs.remove(s) #inputs中也删除掉
69 s.close() #把这个连接关闭掉
70
71 # Remove message queue
72 del message_queues[s]
73 # Handle outputs
74 for s in writable:
75 try:
76 next_msg = message_queues[s].get_nowait()
77 """get_nowait:Remove and return an item from the queue without blocking.
78
79 Only get an item if one is immediately available. Otherwise
80 raise the Empty exception.
81 """
82 except queue.Empty:
83 # No messages waiting so stop checking for writability.
84 print('output queue for', s.getpeername(), 'is empty')
85 #getpeername()返回连接套接字的远程地址。返回值通常是元组(ipaddr,port)。
86 outputs.remove(s)
87 else:
88 print( 'sending "%s" to %s' % (next_msg, s.getpeername()))
89 s.send(next_msg)
90 # Handle "exceptional conditions"
91 for s in exceptional:
92 print('handling exceptional condition for', s.getpeername() )
93 # Stop listening for input on the connection
94 inputs.remove(s)
95 if s in outputs:
96 outputs.remove(s)
97 s.close()
98
99 # Remove message queue
100 del message_queues[s]
view code
io多路复用,select,笔记的更多相关文章
- 第五十五节,IO多路复用select模块加socket模块,伪多线并发
IO多路复用select模块加socket模块,伪多线并发,并不是真正的多线程并发,实际通过循环等待还是一个一个处理的 IO多路复用,lo就是文件或数据的输入输出,IO多路复用就是可以多用户操作 IO ...
- Linux IO多路复用 select
Linux IO多路复用 select 之前曾经写过简单的服务器,服务器是用多线程阻塞,客户端每一帧是用非阻塞实现的 后来发现select可以用来多路IO复用,就是说可以把服务器这么多线程放在一个线程 ...
- io多路复用-select()
参照<Unix网络编程>相关章节内容,实现了一个简单的单线程IO多路复用服务器与客户端. 普通迭代服务器,由于执行recvfrom则会发生阻塞,直到客户端发送数据并正确接收后才能够返回,一 ...
- 转一贴,今天实在写累了,也看累了--【Python异步非阻塞IO多路复用Select/Poll/Epoll使用】
下面这篇,原理理解了, 再结合 这一周来的心得体会,整个框架就差不多了... http://www.haiyun.me/archives/1056.html 有许多封装好的异步非阻塞IO多路复用框架, ...
- Python实战之IO多路复用select的详细简单练习
IO多路复用 I/O多路复用指:通过一种机制,可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. select 它通过一个select()系统调用来 ...
- I/O模型系列之五:IO多路复用 select、poll、epoll
IO多路复用之select.poll.epoll IO多路复用:通过一种机制,一个进程可以监视多个描述符,一旦某个描述符就绪(一般是读就绪或者写就绪),能够通知程序进行相应的读写操作. 应用:适用于针 ...
- IO多路复用select/poll/epoll详解以及在Python中的应用
IO multiplexing(IO多路复用) IO多路复用,有些地方称之为event driven IO(事件驱动IO). 它的好处在于单个进程可以处理多个网络IO请求.select/epoll这两 ...
- IO多路复用 select、poll、epoll
什么是IO多路复用 在同一个线程里面, 通过拨开关的方式,来同时传输多个(socket)I/O流. 在英文中叫I/O multiplexing.这里面的 multiplexing 指的其实是在单个线程 ...
- Python异步非阻塞IO多路复用Select/Poll/Epoll使用,线程,进程,协程
1.使用select模拟socketserver伪并发处理客户端请求,代码如下: import socket import select sk = socket.socket() sk.bind((' ...
- 网络编程socket 结合IO多路复用select; epool机制分别实现单线程并发TCP服务器
select版-TCP服务器 1. select 原理 在多路复用的模型中,比较常用的有select模型和epoll模型.这两个都是系统接口,由操作系统提供.当然,Python的select模块进行了 ...
随机推荐
- problem
有两个数组a,b,大小都为n,数组元素的值任意,无序: 要求:通过交换a,b中的元素,使数组a元素的和与数组b元素的和之间的差最小
- Angularjs-Dirty Checking
Angularjs实现了数据双向绑定,就像下面这样: <!doctype html> <htnl ng-app> <head> <script src=&qu ...
- 自定义UITableViewCell
随着日常的使用,系统提供的cell已经不能满足开发的需要,因为系统提供的是单一的,所以 这就引来了自定义cell的出现,可以根据 自己的需要来布局各个控件所处的位置.不同位置显示不同的控件. 创建一个 ...
- C# JSON to object
/// <summary> /// json格式转换(引用System.Web.Extension类库) /// </summary> /// <param name=& ...
- swift 代码添加image
let image_ElectricianBtn = UIImage(named: "ElectricianBtn") let vimage_ElectricianBtn = UI ...
- 【DIOCP知识库】连接上下文TIocpClientContext
来自弦子介绍 [概述] 该类管理远程连接,每一个远程连接会对应一个该类的实例,开发时可以通过继承该类,扩展属性,可以存储更多的连接信息,可以重写OnRecvBuffer方法进行数据逻辑的处理 [字段/ ...
- Groovy basic
1. print println "Hello Groovy!" you can use java in Groovy System.out.println("Hello ...
- POJ 1873 - The Fortified Forest 凸包 + 搜索 模板
通过这道题发现了原来写凸包的一些不注意之处和一些错误..有些错误很要命.. 这题 N = 15 1 << 15 = 32768 直接枚举完全可行 卡在异常情况判断上很久,只有 顶点数 &g ...
- 开发Android应用怎么更改LOGO图标
开发安卓应用怎么更改LOGO图标,我们知道我们开发安卓程序的时候,都需要给他整一个logo,一般开发程序都会自动一个图标,我们怎么给他更换自己想要的logo图标,之前大家看过我们写的怎么安装程序到虚拟 ...
- web工程中URL地址的推荐写法
三.web工程中URL地址的推荐写法 使用c标签<c:url value="" /> 会自动添加项目名 -> value中的值 前面要加 “/” 在JavaWeb ...