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万个元素的列表,不仅占用很大的存储空间,如果我们仅 ...
随机推荐
- Linux C Programing - Arguments(2)
#include <iostream> #include <stdlib.h> #include <stdio.h> //printf #include <u ...
- Frost R&D
Trees Procedural Math Model in Houdini,render with Mantra. Shader use SurfaceModel With Other Attrib ...
- Worker Thread
http://www.codeproject.com/Articles/552/Using-Worker-Threads Introduction Worker threads are an eleg ...
- Linux系统软件
ubuntu系统镜像文件: http://pan.baidu.com/s/1jGGgszO 虚拟机: http://pan.baidu.com/s/1hqrhQQg
- LA 3713 宇航员分组
题目链接:http://vjudge.net/contest/142615#problem/B 题意:有A,B,C三个人物要分配个N个宇航员,每个宇航员恰好要分配一个任务,设平均年龄为X,只有年龄大于 ...
- 2016年12月25日 星期日 --出埃及记 Exodus 21:20
2016年12月25日 星期日 --出埃及记 Exodus 21:20 "If a man beats his male or female slave with a rod and the ...
- springMVC简单示例
1.新建web工程 2.引入springframework架包 3.配置文件 web.xml <?xml version="1.0" encoding="UTF-8 ...
- 解决float浮动带来的父元素高度没有的问题---清除浮动
float的特性 : 1:使元素block块级化: 2:破坏性造成的紧密排列特性. 基于以上的特性,使得我们通常把浮动用来布局,带来的问题是,容易出问题,重用性不行,ie6-的版本下很多问题,因为它是 ...
- Pycharm使用问题# 行号设置
设置行号就很简单了,在Settings中找到Editor-Appearance,选中Show line numbers即可.
- Linux shell中运行命令后加上字符“&”的作用
上午登录服务器编译运行服务端程序的时候,学到了在命令后加上字符“&”后,退出shell,运行的命令可以继续运行.不解原因,并到网上搜索了以下,明白了点! 以下是搜索到的片段: & 放在 ...