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模块进行了 ...
随机推荐
- Thinkphp源码分析系列(一)–入口文件
正如官方文档上所介绍的,thinkphp使用单一入口,所有的请求都从默认的index.php文件进入.当然不是说一定非得从index.php进入,这应该取决于你的服务器配置,一般服务器都会有默认的首页 ...
- <a>标签的href和onclick属性
讨论 <a>标签中,href和onclick事件的顺序与冲突问题. 首先明确一点:链接的onclick 事件被先执行,其次是href属性下的动作(页面跳转,或 javascript 伪链接 ...
- linux grep命令详解
linux grep命令详解 简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来 ...
- vc++ 如何添加右键弹出菜单
一.创建新工程 二.编辑菜单资源 1.添加菜单 按"Ctrl+R",双击"Menu"图标 2.于菜单编辑器内编辑菜单 四.添加代码(红色部分) void CCM ...
- 【MVC】 js,css 压缩
[MVC] js,css 压缩 一. 引用 System.Web.Optimization.dll : 使用 Nuget ,在控制台输入 Install-Package Microsoft.AspNe ...
- 手机抓包xcode自带命令行工具配合wireshark实现
三.最佳方式:rvictl命令 优点:简单,而且可以抓所有网络接口的数据: 缺点:似乎没有,要求手机iOS5以上不算要求吧?如果说缺点,就是这个命令是Xcode的Command Line Tools ...
- handler 异步执行(进度条加载到100)
生明一个handler 对象(可重写handlerMessage 方法) 声明一个Runnable 对象,需重写run方法 按钮事件:handler对象实例的post方法调用线程. 线程的run方法开 ...
- 初识ASP.NET CORE:三、Middleware
Middleware are simpler than HTTP modules and handlers:Modules, handlers, Global.asax.cs, Web.config ...
- android笔记:DatePickerDialog日期设置对话框
在开发中,可以通过DatePickerDialog来设置日期,TimePickerDialog来设置时间. 实例化DatePickerDialog对象之后,再调用show方法就可以显示对话框了. 具体 ...
- ASP.NET ZERO Core Application 学习笔记
地址:https://www.aspnetzero.com/Documents/Development-Guide-Core 1.恢复数据库 MIGRATOR CONSOLE APPLICATION ...