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模块进行了 ...
随机推荐
- nodejs Express 4.x req.body req.query req.params 三种获取参数的方法
第一种情况:http://localhost:3000/1,我们可以用req.params.(应该是跟路由有关,待) 第二种情况:http://localhost:3000/?id=1,用req.qu ...
- how to monitor system logs and export to files simultaneously
What will you do when you conduct a malware analysis on a smartphone? You will focus on running proc ...
- PHP echo 即时输出
header(“Content-type:text/html;charset=utf-8″); #设置执行时间不限时 set_time_limit(0); #清除并关闭缓冲,输出到浏览器之前使用这个函 ...
- <img>标签
<img src="w3school.jpg" width="104" height="142" />注释:图像的名称和尺寸是以 ...
- meta标签总结
1."format-detection" format-detection翻译成中文的意思是“格式检测”,顾名思义,它是用来检测html里的一些格式的, 那关于meta的forma ...
- iOS定位到崩溃代码行数
不知道大家是不是在代码调试过程中经常遇到项目崩溃的情况: 比如: 数组越界: 没有实现方法选择器: 野指针: 还有很多很多情况.......昨天学到了一种可以直接定位到崩溃代码行数的一个命令,记录一下 ...
- Selenium2+python自动化2-pip降级selenium3.0
selenium版本安装后启动Firefox出现异常:'geckodriver' executable needs to be in PATH selenium默默的升级到了3.0,然而网上的教程都是 ...
- elasticsearch Java API汇总
http://blog.csdn.net/changong28/article/details/38445805#comments 3.1 集群的连接 3.1.1 作为Elasticsearch节点 ...
- 关于Android的布局
Android中五大布局是直接继承ViewGroup的布局:RelativeLayout.GridLayout.FrameLayout.AbsoluteLayout.LinnerLayout(Tabl ...
- [转]Sql server2005中如何格式化时间日期
) -- mon dd yyyy hh:mmAM (or PM) ) -- mm/dd/yyyy - 10/02/2008 ) -- yyyy.mm.dd -- 2008.10.02 ) -- dd/ ...