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万个元素的列表,不仅占用很大的存储空间,如果我们仅 ...
随机推荐
- Redis常见用法
using ServiceStack.Redis;using System;using System.Collections.Generic;using System.Linq;using Syste ...
- border:0; VS border:none;
border:none与border:0的区别体现为两点:一是理论上的性能差异,二是浏览器兼容性的差异. 性能差异: [border:0;]把border设为“0”像素效果等于border-width ...
- JFrame中setDefaultCloseOperation的参数含义
实例1:一个空的java窗口 // JFrameDemo1.java import javax.swing.*; //使用Swing类,必须引入Swing包 public class JFra ...
- HTML5正确的嵌入flash
<object type="application/x-shockwave-flash" data="your-flash-file.swf" width ...
- 凯撒加密(key为3)
基本思想: 加密是把字符串中的每一个字符+3解密是每一个字符-3 源代码: package demo;import java.util.Scanner; class Encryption{ Strin ...
- jsp标签精华(持续更新中)
<%@ taglib uri="/struts-tags" prefix="s" %> <%@ taglib uri="http:/ ...
- 高宽不定的div相对父div上下、左右居中
<div class="parent"> <div class="child">123</div> </div> ...
- psd切图
打开UI设计师给你的PSD文件,我们以下图为例,截产品超市前面的购物车 1.按v选择移动工具,然后在上面的选项栏中勾选自动选择,在再右边选择图层 2.这时候用鼠标选中产品超市前面的购物车,就能在右边的 ...
- iOS FMDB的使用
简介: SQLite (http://www.sqlite.org/docs.html) 是一个轻量级的关系数据库.iOS SDK 很早就支持了 SQLite,在使用时,只需要加入 libsqlite ...
- Eclipse 最全快捷键
英文的