Python的平凡之路(10)
- 无需线程上下文切换的开销
- 无需原子操作锁定及同步的开销
- 方便切换控制流,简化编程模型
- 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。
#Author is wspikh
# -*- coding: encoding -*-
print('12')
gr2.switch()
print('--第二次切换完毕--')
print('34')
def test2():
print('--第一次切换完毕--')
print('56')
gr1.switch()
print('--第三次切换完毕--')
print('78')
gr1 = greenlet(test1) #启动一个协程
gr2 = greenlet(test2)
#Author is wspikh
# -*- coding: encoding -*-
print('Running in foo')
gevent.sleep(3)
print('Explicit context to bar')
gevent.sleep(2)
print("running func on")
gevent.sleep(1)
gevent.spawn(foo),
gevent.spawn(bar),
gevent.spawn(func)
])
#Author is wspikh
# -*- coding: encoding -*-
import sys
import socket
import time
import gevent
from gevent import socket, monkey
monkey.patch_all()
s = socket.socket()
s.bind(('0.0.0.0', port))
s.listen(500)
while True:
cli, addr = s.accept()
gevent.spawn(handle_request, cli)
try:
while True:
data = conn.recv(1024)
print("recv:", data)
conn.send(data)
if not data:
conn.shutdown(socket.SHUT_WR)
except Exception as ex:
print(ex)
finally:
#Author is wspikh
# -*- coding: encoding -*-
#_*_coding:utf-8_*_
import socket
HOST = 'localhost' # The remote host
PORT = 9999 # The same port as used by the server
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
while True:
msg = bytes(input(">>:"), encoding="utf8")
s.sendall(msg)
data = s.recv(1024)
#print(data)
print('Received', repr(data))
s.close()
当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。所以,I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回。
#Author is wspikh
# -*- coding: encoding -*-
import socket
import sys
messages = ['This is the message',
'It will be sent',
'in parts.',
]
server_address = ('localhost',10000)
# Create a TCP/IP socket
socks = [ socket.socket(socket.AF_INET,socket.SOCK_STREAM),
socket.socket(socket.AF_INET,socket.SOCK_STREAM),
]
# Connect the socket to the port where ther server is listning
print(sys.stderr,'connecting to %s port %s' % server_address)
for s in socks:
s.connect(server_address)
for message in messages:
# Send messages on both sockets
for s in socks:
print(sys.stderr, '%s: sending "%s"' %(s.getsockname(),message))
s.send(message.encode('utf-8'))
# Read responses on both sockets
for s in socks:
data = s.recv(1024)
print(sys.stderr,'%s: received "%s"' %(s.getsockname(),data))
if not data:
print(sys.stderr,'closing socket',s.getsockname())
s.close()
#Author is wspikh
# -*- coding: encoding -*-
import select
import socket
import sys
import queue
# Create a TCP/IP socket
server = socket.socket()
server.setblocking(False) #非阻塞模式
# Bind the socket to the port
server_address = ('localhost',10000)
print(sys.stderr,'starting up on %s port %s' % server_address)
server.bind(server_address)
# Listen for incoming connection
server.listen(200)
# Sockets from which we expect to read
inputs = [server,]
# Sockets to which we expect to write
outputs = [ ]
message_queues = {}
while True:
# Wait for at least on of the sockets to be ready for processing
print('\nwaiting for the next event')
readable, writeable, exceptional = select.select(inputs,outputs,inputs)
print(readable, writeable, exceptional)
# Handle inputs
for s in readable:
if s is server:
# A"readable" server socket is ready to accept a connection
conn,addr = s.accept()
print('new connection from',conn,addr)
#conn.setblocking(False)
inputs.append(conn)
# Give the connection a queue for data we want to send
message_queues[conn] = queue.Queue()
else:
data = s.recv(1024)
if data:
# A readable client socket has data
print(sys.stderr,'received "%s" from %s' %(data,s.getpeername()))
message_queues[s].put(data)
# Add output channel for response
if s not in outputs:
outputs.append(s)
else:
# Interpret empty result as closed connection
print('closing',addr,'after reading no data')
# Stop listening for input on the connection
if s in outputs:
outputs.remove(s)
inputs.remove(s)
s.close()
# Remove message queue
del message_queues[s]
# Handle outputs
#if __name__ == '__main__':
for s in writeable:
try:
next_msg = message_queues[s].get_nowait()
except queue.Empty:
# No messages waiting so stop checking for writebility
print('output queue for', s.getpeername(),'is empty')
outputs.remove(s)
else:
print('sending "%s" to %s' % (next_msg,s.getpeername()))
s.send(next_msg)
# Handle "exceptional conditions"
for s in exceptional:
print("Handing exceptional condition for",s.getpeername())
# Stop listening for input on the connection
inputs.remove(s)
if s in outputs:
outputs.remove(s)
s.close()
# Remove message queue
del message_queues[s]
Python的平凡之路(10)的更多相关文章
- Python的平凡之路(8)
(本文是对平凡之路(7)的补充等) 一.动态导入模块 import importlib __import__('import_lib.metaclass') #这是解释器自己内部用的 #importl ...
- Python的平凡之路(20)
(提问复习为主) 一.Django请求的生命周期 武彦涛: 路由系统 -> 视图函数(获取模板+数据=>渲染) -> 字符串返回给用户 二.路由 ...
- Python的平凡之路(16)
一.HTML+CSS补充 0.常用页面布局 <!DOCTYPE html> <html lang="en"><head> <meta ch ...
- Python的平凡之路(13)
一.Python的paramiko模块介绍 Python 的paramiko模块,该模块和SSH用于连接远程服务器并执行相关操作 SSH client 用于连接远程服务器并执行基本命令 基于用户名和密 ...
- Python的平凡之路(12)
一.数据库介绍 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据.我们也可以将数据存储在文件中,但 ...
- Python的平凡之路(11)
一. rabbitmq 1 进程Queue: 父进程与子进程进行交互,或者同属于同一父进程下多个子进程进行交互 2 队列通信: send1.py #!/usr/bin/env python#Au ...
- Python的平凡之路(9)
一.Paramiko模块练习 1. Paramiko模块介绍 Paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 2 .SSHclie ...
- Python的平凡之路(5)
一.模块介绍 定义: 模块--用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质就是.py结尾的python文件(文件名test.py,模块名test) 包—用来从逻辑上组织 ...
- Python的平凡之路(4)
一.迭代器&生成器 生成器定义: 通过列表生成式,我们可以直接创建一个列表.但是,受到内存限制,列表容量肯定是有限的.而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅 ...
随机推荐
- Extract Stylish styles and save as JSON format
Introduction Stylish is a easy browser extension/plugin for users to customizing the web page stylin ...
- 基于webrtc的资源释放问题(一)
基于webrtc的资源释放问题(一) ——重复释放webrtc的相关资源 背景: 视频通讯大都只是作为一个功能存在于各种应用中,比如微信,qq .既然只是应用的一部分,这样就涉及反复的开启和关闭视频通 ...
- Viking Village维京村落demo中的地面积水效果
效果如下: 似乎是通过高光贴图实现的,查找后发现具体在这: 它使用了基于Standard的TerrainSurface自定义Shader,关闭该帖图后效果消失: 这个TerrainSurfaceSha ...
- 【Linux命令与工具】磁盘与目录的容量——df和du
df(disk free):列出文件系统的整体磁盘使用量 用法: df [-akmhi] [目录或文件名] 参数: -a: 列出所有的文件系统,包括系统特有的/proc等文件系统 -k: 以KB的容量 ...
- 简单的计算最值的MapReduce程序
import java.io.IOException;import java.util.StringTokenizer;import java.util.*;import org.apache.had ...
- h-ui前端框架
h-ui.net
- Working with Binary Data in Python
http://www.devdungeon.com/content/working-binary-data-python
- Beaglebone Black–I2C 接 BMP280 获取当前温度
我有两个含温度传感的模块,一个是AOSONG 奥松电子的 AM2320 温度湿度,另一个是九轴里面的 Bosch BMP280.由于 AM2320 用 I2C MODBUS,直接用 I2C Tools ...
- BZOJ 2286: [Sdoi2011]消耗战
2286: [Sdoi2011消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 2082 Solved: 736[Submit][Status] ...
- ubuntu15.04 安装 pylab失败,先记下来,漫漫看
pydo@planpls:/var/python/web2py$ pip install pylab Downloading/unpacking pylab Downloading pylab-0.1 ...