又名微线程、纤程。
优点:
1.协程极高的执行效率。以为子程序不是线程切换,而是由程序自身控制。因此没有线程切换的开销,跟多线程相比,线程数量越多,协程的性能优势就越明显。
- 不需要多线程的锁机制。因为只有一个线程,也不存在同时写变量冲突。在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法就是多进程 + 协程,既可以利用多核,又可以发挥协程的高性能优势。
greenlet是一个用c实现的协程模块,相比于python自带的yield,它可以使你在任意函数之间随意切换,而不需要把这个函数先声明为generator
from greenlet import greenlet
def test1():
print(12)
gr2.switch()
print(34)
def test2():
print(56)
gr1.switch()
print(78)
gr1.switch()
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr2.switch()
Gevent
from greenlet import greenlet
def test1():
print(12)
gr2.switch()
print(34)
def test2():
print(56)
gr1.switch()
print(78)
gr1.switch()
gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr2.switch()
import gevent
import requests,time
start=time.time()
def f(url):
print('GET: %s' % url)
resp =requests.get(url)
data = resp.text
print('%d bytes received from %s.' % (len(data), url))
f('https://www.python.org/')
f('https://www.yahoo.com/')
f('https://www.baidu.com/')
f('https://www.sina.com.cn/')
f("http://www.xiaohuar.com/hua/")
# gevent.joinall([
# gevent.spawn(f, 'https://www.python.org/'),
# gevent.spawn(f, 'https://www.yahoo.com/'),
# gevent.spawn(f, 'https://www.baidu.com/'),
# gevent.spawn(f, 'https://www.sina.com.cn/'),
# gevent.spawn(f, 'http://www.xiaohuar.com/hua/'),
# ])
# f('https://www.python.org/')
#
# f('https://www.yahoo.com/')
#
# f('https://baidu.com/')
# f('https://www.sina.com.cn/')
print("cost time:",time.time()-start)