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模块进行了 ...
随机推荐
- Jmeter-获取响应结果中参数出现的次数
在测试中,有时候会遇到要统计响应结果中某个参数出现了多少次,如果量级很大,一个一个数不太现实,下面讲一下实现自动打印出该参数出现的次数的方法. 例如我的响应信息为:{"ip":&q ...
- CAS 与.net 集成的 “循环重定向”问题分析
转自:http://www.cnblogs.com/xingshao/archive/2011/09/29/2195746.html 近期的一个项目,项目包含了若干的子系统,因为人员配备的原因,项目会 ...
- listed
http://sebastianruder.com/optimizing-gradient-descent/ http://www.nag.co.uk/pss/nag-and-algorithmic- ...
- 用shell脚本切分task_list,并分别执行的脚本
#/bin/sh TASK_LIST=$ len=`wc -l $TASK_LIST | awk '{print $1}'` #noExce(){ ) ))'p' $TASK_LIST > $T ...
- 简洁既是美—用while语句复制数组
简洁既是美,程序员应尽量尝试编写简洁的表达式,争取用简单的代码来实现更多的功能,当然,这也要看情况了(有时候也得考虑程序运行的时间嘛). 在阅读C++Prime Plus到while语句时有一个讲一个 ...
- findstr 命令
body { font-family: Bitstream Vera Sans Mono; font-size: 11pt; line-height: 1.5; } html, body { colo ...
- mysql 主从复制原理
主从形式 mysql主从复制 灵活 一主一从 主主复制 一主多从---扩展系统读取的性能,因为读是在从库读取的: 多主一从---5.7开始支持 联级复制--- 用途及条件 mysql主 ...
- VMware学习笔记(一)
vmware核心产品是vSphere,而vSphere主要包括ESXi和vCenterServer. ESXi不依赖其它操作系统OS,安装在每一台物理机上,ESXi是免费的.在ESXi主机上再安装vS ...
- Jmeter外部函数引用
Jmeter外部函数引用 1.Beanshell引用Jmeter变量 添加用户自定义变量,输入变量名称和变量值,添加Debug sampler,用于输出初始变量值.
- 借助取色工具ColorPix对Pycharm编辑器设定自己喜欢的代码颜色_20161202
1.Pycharm编辑器怎么设定自己喜欢的颜色,前几天看爬虫博客,看博主贴出的代码颜色很是喜欢,如下图,设置了好多次找不到他设定的颜色. 2.下班回家想起来之前做表的时候用到过一个取色工具ColorP ...