python网络库也有了基于协程的实现,比较著名的是 gevent、eventlet 它两之间的关系可以参照

Comparing gevent to eventlet, 本文主要简单介绍一下eventlet一个例子

客户端:

import eventlet
from eventlet.green import urllib2

def myfetch(myurl, i):
req = urllib2.Request(myurl)
req.add_header('User-agent', 'Mozilla 5.10')
res = urllib2.urlopen(req, timeout = 4)
body = res.read();
size = len(body);
print (i, 'body size ' ,size)
return size

myurl = "http://127.0.0.1:6000"
pool = eventlet.GreenPool(1000)
for i in range(1, 200):
pool.spawn(myfetch, myurl, i)
#print i
pool.waitall()
print "--finish --GreenPool"
服务端:

#! /usr/bin/env python
"""\
Simple server that listens on port 6000 and echos back every input to
the client. To try out the server, start it up by running this file.
Connect to it with:
telnet localhost 6000
You terminate your connection by terminating telnet (typically Ctrl-]
and then 'quit')
"""
from __future__ import print_function

import eventlet

def handle(fd): #单个协程的处理逻辑
print("client connected")
while True:
# pass through every non-eof line
x = fd.readline()
if not x:
break
fd.write(x)
fd.flush()
print("echoed", x, end=' ')
print("client disconnected")

print("server socket listening on port 6000")
server = eventlet.listen(('0.0.0.0', 6000)) #监听6000端口
pool = eventlet.GreenPool() #构造协程池
while True:
try:
new_sock, address = server.accept() #accept新的连接
print("accepted", address)
pool.spawn_n(handle, new_sock.makefile('rw')) #将新的连接交由一个新的协程去处理
except (SystemExit, KeyboardInterrupt):
break
上面的例子可以看出eventlet接口还是非常的简洁和优雅的,至于稳定性和成熟度还待真实的场景去验证,
使用eventlet快速开发一个tcp/http的server还是非常迅速的,因为是基于协程的, 对于网络IO密集型的场景
速度不会太差.
eventlet已知的在openstack项目中有使用.
---------------------
作者:mumumuwudi
来源:CSDN
原文:https://blog.csdn.net/mumumuwudi/article/details/47116493
版权声明:本文为博主原创文章,转载请附上博文链接!

python基于协程的网络库gevent、eventlet的更多相关文章

  1. 一个python爬虫协程的写法(gevent模块)

    from bs4 import BeautifulSoup import requests import gevent from gevent import monkey, pool monkey.p ...

  2. 基于协程的Python网络库gevent

    import gevent def test1(): print 12 gevent.sleep(0) print 34 def test2(): print 56 gevent.sleep(0) p ...

  3. {python之协程}一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二

    python之协程 阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本 ...

  4. python之协程gevent模块

    Gevent官网文档地址:http://www.gevent.org/contents.html 进程.线程.协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩 ...

  5. Python实现基于协程的异步爬虫

    一.课程介绍 1. 课程来源 本课程核心部分来自<500 lines or less>项目,作者是来自 MongoDB 的工程师 A. Jesse Jiryu Davis 与 Python ...

  6. 基于ASIO的协程与网络编程

    协程 协程,即协作式程序,其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态.协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行. 协程 ...

  7. python协程详解,gevent asyncio

    python协程详解,gevent asyncio 新建模板小书匠 #协程的概念 #模块操作协程 # gevent 扩展模块 # asyncio 内置模块 # 基础的语法 1.生成器实现切换 [1] ...

  8. python中的协程:greenlet和gevent

    python中的协程:greenlet和gevent 协程是一中多任务实现方式,它不需要多个进程或线程就可以实现多任务. 1.通过yield实现协程: 代码: import time def A(): ...

  9. lua:写了个基于协程的task调度库

    写了一个(不完整的)基于协程的task调度库 sample code如下 my_spawn( function () print('f: 1') local t1 = my_spawn( functi ...

随机推荐

  1. 3vim编辑器

    三种模式命令行模式任何模式下 ESC 进入编辑模式(INSERT)从命令模式下 a, i 等 进入可视化模式(VISUAL)(VISUAL BLOCK)命令模式下,敲 v 进入非编辑模式, ctrl ...

  2. Codeforces Round #523 (Div. 2) Solution

    A. Coins Water. #include <bits/stdc++.h> using namespace std; int n, s; int main() { while (sc ...

  3. ZOJ Monthly, June 2018 Solution

    A - Peer Review Water. #include <bits/stdc++.h> using namespace std; int t, n; int main() { sc ...

  4. 2018 eclipse安装反编译插件

    1.在eclipse的help—>Install New Software...中添加新软件开发,添加它的源:     name:jd-eclipse_update_site address:h ...

  5. Java中com.jcraft.jsch.ChannelSftp讲解

    http://blog.csdn.net/allen_zhao_2012/article/details/7941631 http://www.cnblogs.com/longyg/archive/2 ...

  6. Python3:sqlalchemy对mysql数据库操作,非sql语句

    Python3:sqlalchemy对mysql数据库操作,非sql语句 # python3 # author lizm # datetime 2018-02-01 10:00:00 # -*- co ...

  7. 如何写一个自己的渣渣PHP框架

    原文链接:https://www.opqnext.com/2017/01/18/%E5%A6%82%E4%BD%95%E5%86%99%E4%B8%80%E4%B8%AA%E8%87%AA%E5%B7 ...

  8. 20145104张家明 《Java程序设计》第一周学习总结

    20145104张家明 <Java程序设计>第1周学习总结 教材学习内容总结 在开学的第一周,通过了看书进行了系统的学习java,首先简单的了解java的发展历程,然后了解了JVM.JRE ...

  9. 树莓派实践部分——P2P文件下载机torrent之Raspberry Pi管理

    树莓派实践--P2P文件下载机torrent之Raspberry Pi管理 一.树莓派配置文件共享软件deluge 在进行实践之前,先通过命令sudo apt-get update 和sudo apt ...

  10. 20145219《网络对抗》MSF基础应用

    20145219<网络对抗>MSF基础应用 基础问题回答 用自己的话解释什么是exploit,payload,encode exploit:把实现设置好的东西送到要攻击的主机里. payl ...