python之高性能网络编程并发框架eventlet实例
http://blog.csdn.net/mingzznet/article/details/38388299
前言:
虽然 eventlet 封装成了非常类似标准线程库的形式,但线程和eventlet在实际并发执行流程仍然有明显区别。在没有出现 I/O 阻塞时,除非显式声明,否则当前正在执行的 eventlet 永远不会把 cpu 交给其他的 eventlet,而标准线程则是无论是否出现阻塞,总是由所有线程一起争夺运行资源。所有 eventlet 对 I/O 阻塞无关的大运算量耗时操作基本没有什么帮助。
Eventlet 的基础是 greenlet,这是实现 "协程(Coroutine)" 的基础.协程又被称作 "微线程“,简单点说就是在一个原生线程上通过 "拷贝" 和 "切换" 堆栈帧数据来实现执行多个工作绪.看上去和传统的 "单CPU,多线程(Threading)" 执行方式差不多. swpan() 启动一个 GreenThread 执行目标函数,wait() 返回函数执行结果。
| 
1 
2 
3 
4 | importeventletpoolwhileTrue:     pool.spawn(func,args | 
上面这段代码,几乎就是使用eventlet的范式:
GreenPool 用来实现协程,保证并行;
Spawn 用来调用相应的函数,完成具体业务
每个func之间切换,实施“你运行一会、我运行一会”,并且在进行切换时必须指定何时切换以及切换到哪,当出现阻塞时,就显式切换到另一段没有被阻塞的代码段执行,直到原先的阻塞状况消失以后,再人工切换回原来的代码段继续处理.
首先需要安装eventlet的相关模块

我们先简单跑一个demo !

他的用法其实和threading差不多的,都可以指定pool和函数的。(有点废话)
为啥叫他网络编程框架,因为他支持很多底层的东西,比如http,比如socket啥的。
| 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 | #!#8-*-fromimportapidef    req=''    whileTrue:        chunk=reader.readline()        ifnot            break        req+=chunk        ifchunk=='\r\n':            break    data='Hello    writer.write('HTTP/1.1%(len(data),data))    writer.close()    reader.close()    returndef    try:        server=api.tcp_listener(('0.0.0.0',3000))        print 'Server        whileTrue:            conn,addr=server.accept()            #print 'client%repr(addr)            writer=conn.makefile('w')            api.spawn(httpd,writer,conn.makefile('r'))    except        pass    returnif__name__=='__main__':    main() | 
咱们来测试下这个用eventlet实现的http吧!

客户端访问下

下面是利用wait()堵塞行为,保证他是同步的运行。

python之高性能网络编程并发框架eventlet实例的更多相关文章
- python之元编程(元类实例)
		本实例是元类实例,功能是记录该的子类的类名,并以树状结构展示子类的类名. RegisterClasses继承自type,提供的功能是在__init__接口,为类创建了childrens的集合,并类名保 ... 
- Python面向对象高级编程:__slot__(给实例添加方法、属性)
		纲要: 本章总的来说是给实例添加属性,给类添加方法两个主题,以及相应的作用范围.总结如下: 1.给实例添加属性(作用范围:当然是只对当前实例有效): 2.用__slots__限制可以给实例添加的属性( ... 
- Python开源异步并发框架
		Python开源异步并发框架的未来 2014年3月30日,由全球最大的中文IT社区CSDN主办的“开源技术大会·” (Open Source Technology Conference ,简称OSTC ... 
- 【原创】高性能网络编程(二):上一个10年,著名的C10K并发连接问题
		1.前言 对于高性能即时通讯技术(或者说互联网编程)比较关注的开发者,对C10K问题(即单机1万个并发连接问题)应该都有所了解."C10K"概念最早由Dan Kegel发布于其个人 ... 
- Python 开源异步并发框架的未来
		http://segmentfault.com/a/1190000000471602 开源 Python 是开源的,介绍的这几个框架 Twisted.Tornado.Gevent 和 tulip 也都 ... 
- python 使用多进程实现并发编程/使用queue进行进程间数据交换
		import time import os import multiprocessing from multiprocessing import Queue, pool ""&qu ... 
- 【网络】高性能网络编程--下一个10年,是时候考虑C10M并发问题了
		转载:http://www.52im.net/thread-568-1-1.html 1.前言 在本系列文章的上篇中我们回顾了过云的10年里,高性能网络编程领域著名的C10K问题及其成功的解决方案(上 ... 
- (转)java并发编程--Executor框架
		本文转自https://www.cnblogs.com/MOBIN/p/5436482.html java并发编程--Executor框架 只要用到线程,就可以使用executor.,在开发中如果需要 ... 
- 初试Gevent – 高性能的Python并发框架
		Gevent是一个基于greenlet的Python的并发框架,以微线程greenlet为核心,使用了epoll事件监听机制以及诸多其他优化而变得高效. 于greenlet.eventlet相比,性能 ... 
随机推荐
- html5笔记
			出处:http://www.cnblogs.com/xiaowei0705/archive/2011/04/19/2021372.html HTML5 LocalStorage 本地存储 HTML5 ... 
- java匿名内部类练习
			interface Inter { void method(); } class Test { //补足代码.通过匿名内部类. /* static class Inner implements Int ... 
- 【转】404、500、502等HTTP状态码介绍
			基本涵盖了所有问题HTTP 400 – 请求无效HTTP 401.1 – 未授权:登录失败HTTP 401.2 – 未授权:服务器配置问题导致登录失败HTTP 401.3 – ACL 禁止访问资源HT ... 
- Git 技巧小结
			本篇博客内的内容,主要摘抄自 廖雪峰的 Git教程,这篇教程写的通俗易懂,步步深入,是我见过最棒的Git教程了.下面的全部内容,摘抄自此教程,有需要的朋友,请看完整版. Git版本库 git在创建版本 ... 
- Contiki学习入门之概览
			Contiki是专为物联网领域而设计的开源操作系统,适用于联网嵌入式系统和无线传感器网络.由瑞典计算机科学学院的Adam Dunkels团队开发.它有以下几个特点. 1. 网络标准 contiki提供 ... 
- HLG 1400 汽车比赛
			题目链接:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1400 结构体排序+树状数 ... 
- zabbix短信网关调用问题总结
			在写调用短信网关的shell脚本的时候,发现了一个百思不得其解的问题,用浏览器访问短信接口地址是可以成功接收到短信的.但在shell 里面调用就报错了!!!在反复测试当中发现,在shell 中对特殊字 ... 
- c#中的枚举
			1.枚举概念:枚举是用户定义的整型类型,在声明一个枚举时,要指定该枚举的实例可以包含的一组可接受的值,还可以给值指定易于记忆的名称.如果在代码的某个地方,要试图把一个不可接受范围内的值赋予枚举的一个实 ... 
- mysql高可用探究 MMM高可用mysql方案
			1 MMM高可用mysql方案 1.1 方案简介 MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器)关于mysql主主复 ... 
- linux实现nginx按照日期存储日志
			通过shell脚本实现+定时任务+nginx信号管理实现日志按日期存储. 1.编写shell脚本,实现日志按日期存储 #!/bin/bash base_path='/home/wwwlogs/' lo ... 
