协程

import time
'''
协程:又称微线程,纤程。英文名Coroutine
优点1: 协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显
优点2: 不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能
'''
# yield的简单实现
# def consumer(name):
#  '''生成器'''
#  print('33[1;45m%s要开始吃包子了...33[0m' % name)
#  while True:
#     baozi = yield # send的值给了baozi这个变量
#     if baozi<51:
#        time.sleep(1)
#        print('33[1;33;41m%s在吃第%s个包子...33[0m' % (name, baozi))
#     else:
#        break
#
# def produser(name):
#  c1.__next__()
#  c2.__next__()
#  n = 1
#  while n<51:
#     try:
#        time.sleep(1)
#        print('33[1;31;43m%s正在做第%s和%s个包子...33[0m' % (name, n, n+1))
#        time.sleep(2)
#        print('%s说做好了两个包子你们快来吃...' % name)
#        c1.send(n)
#        c2.send(n+1)
#        n += 2
#     except Exception:
#        break
#
# if __name__ == '__main__':
#  c1 = consumer('小明')
#  c2 = consumer('小红')
#  produser('小梁')


# greenlet是一个用C实现的协程模块,相比与python自带的yield,它可以使你在任意函数之间随意切换,而不需把这个函数先声明为generator
# from greenlet import greenlet
# def test1():
#  print(12)
#  gr2.switch()
#  print(34)
#  gr2.switch()
#
# def test2():
#  print(56)
#  gr1.switch()
#  print(78)
#  gr1.switch()
#
# gr1 = greenlet(test1)
# gr2 = greenlet(test2)
# gr2.switch()



# 协程gevent
import gevent
import requests

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))

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/'),
])

# 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/')

print('cost time:', time.time() - start)
# 协程:协作式,非抢占式的程序;yield(也算协程);greenlet、gevent算是用户态的切换;协程主要解决的也是IO操作
# 协程本质上就是一个线程,优势:没有切换的消耗和没有锁的概念;是线程那就不能用多核,所以可以采用多进程+协程作为解决并发的方案(协程知识这只是一个开头)
while True: print('studying...')
原文地址:https://www.cnblogs.com/xuewei95/p/14867021.html