运行结不雅:
- start 0
- start 1
- start 2
- end 2
- end 0
- end 1
- import threading
- import urllib2
- def get_body(i):
- print "start",i
- urllib2.urlopen("http://cn.bing.com")
- print "end",i
- for i in range(3):
- t=threading.Thread(target=get_body,args=(i,))
- t.start()
运行结不雅:
解释:大年夜结不雅来看,多线程与协程的效不雅一样,都是达到了IO壅塞时切换的功能。不合的是,多线程切换的是线程(线程间切换),协程切换的是高低文(可以懂得为履行的函数)。而切换线程的开销明显是要大年夜于切换高低文的开销,是以当线程越多,协程的效力就越比多线程的高。(猜想多过程的切换开销应当是最大年夜的)
Gevent应用解释
- monkey可以使一些壅塞的模块变得不壅塞,机制:碰到IO操作则主动切换棘手动切换可以用gevent.sleep(0)(将爬虫代码换成这个,效不雅一样可以达到切换高低文)
- gevent.spawn 启动协程,参数为函数名称,参数名称
- gevent.joinall 停止协程
Python3.x协程
为了测试Python3.x下的协程应用,我在virtualenv下安装了python3.6的情况。
Python3.4今后惹人了asyncio模块,可以很好的支撑协程。
asynico
asyncio是Python 3.4版本惹人的标准库,直接内置了对异步IO的支撑。asyncio的异步操作,须要在coroutine中经由过程yield from完成。
Usage
例子:(需在python3.4今后版本应用)
- import asyncio
- @asyncio.coroutine
- def test(i):
- print("test_1",i)
- r=yield from asyncio.sleep(1)
- print("test_2",i)
- loop=asyncio.get_event_loop()
- tasks=[test(i) for i in range(5)]
- loop.run_until_complete(asyncio.wait(tasks))
- loop.close()
运行结不雅:
解释:大年夜运行结不雅可以看到,跟gevent达到的效不雅一样,也是在碰到IO操妆厩?行切换(所以先输出test_1,等test_1输出完再输出test_2)。但此处我有一点不明,test_1的输出为什么不是按照次序履行的呢?可以比较gevent的输出结不雅(欲望大年夜神能解答一下)。
@asyncio.coroutine把一个generator标记为coroutine类型,然后,我们就把这个coroutine扔到EventLoop中履行。
test()会起首打印出test_1,然后,yield from语法可以让我们便利地调用另一个generator。因为asyncio.sleep()也是一个coroutine,所以线程不会等待asyncio.sleep(),而是直接中断并履行下一?消息轮回。当asyncio.sleep()返回时,线程就可以大年夜yield from拿到返回值(此处是None),然后接下落行下一行语句。
推荐阅读
机能分析vmstat虚拟内存统计用法Usage: vmstat [options] [delay [count]] Options: -a, --active active/inactive memory -f, --forks number of forks since boot -m, --slabs slabinfo -n, --one-header do>>>详细阅读
本文标题:Python协程:概念及其用法
地址:http://www.17bianji.com/lsqh/35784.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示