#协程,又称为微线程,是一种用户态的轻量级线程
#!usr/bin/env python # -*- coding:utf-8 -*- __author__ = "Samson" #greenlet是协程"手动挡切换" from greenlet import greenlet def test1(): print(12) t2.switch()#切换到协程t2 print(36) t2.switch() def test2(): print(48) t1.switch() print(60) t1 = greenlet(test1)#启动一个协程 t2 = greenlet(test2) t1.switch()
#!usr/bin/env python # -*- coding:utf-8 -*- __author__ = "Samson" #greenlet是协程"自动挡切换" import gevent def foo(): print("Running in foo") gevent.sleep(2)#模仿io操作 print("Explicit context switch to foo again") def bar(): print("Explicit精确的 context内容 to bar") gevent.sleep(1) # 模仿io操作 print("Implicit context switch back to bar") gevent.joinall([ gevent.spawn(foo), gevent.spawn(bar), ]) 协程之爬虫
#!usr/bin/env python # -*- coding:utf-8 -*- __author__ = "Samson" from urllib import request import gevent,time from gevent import monkey monkey.patch_all()#将当前所有程序io操作单独做上标记,这样才能用协程方式进行爬虫,否则将会是串行的 def f(url): print("Get: %s" %url) resp = request.urlopen(url) data = resp.read() print("%d bytes received from %s."%(len(data),url)) urls = ["https://www.python.org/", "https://www.yahoo.com/", "https://github.com/"] time_start = time.time() for url in urls: f(url) print("同步cost",time.time()-time_start) async_time_start = time.time() gevent.joinall([ gevent.spawn(f,"https://www.python.org/"), gevent.spawn(f,"https://www.yahoo.com/"), gevent.spawn(f,"https://github.com/"), ]) print("协程cost",time.time()-async_time_start)