#协程,又称为微线程,是一种用户态的轻量级线程
#!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)