# 协程:微线程 # 进程>线程>协程 # Process Thread 协程生成器 ''':cvar 协程:耗时操作 耗时操作:网络请求 网络下载(爬虫),IO:文件的读写 ''' import time def task1(): for i in range(3): print('A' + str(i)) yield time.sleep(2) def task2(): for i in range(3): print('B' + str(i)) yield time.sleep(1) if __name__ == '__main__': g1 = task1() g2 = task2() while True: try: next(g1) next(g2) except: break
----------------------------------------------------------------------------------------------------------------
# greenlet 完成协程任务 import time from greenlet import greenlet def a(): # 任务A for i in range(5): print("A" + str(i)) gb.switch() time.sleep(0.1) def b(): # 任务B for i in range(5): print("B" + str(i)) gc.switch() time.sleep(0.1) def c(): # 任务C for i in range(5): print("C" + str(i)) ga.switch() time.sleep(0.1) if __name__ == '__main__': ga = greenlet(a) gb = greenlet(b) gc = greenlet(c) ga.switch() '''A0 B0 C0 A1 B1 C1 A2 B2 C2 A3 B3 C3 A4 B4 C4'''
-------------------------------------------------------------------------------------------------------------------
# greenlet 完成协程任务 import time import gevent from gevent import monkey monkey.patch_all() def a(): # 任务A for i in range(5): print("A" + str(i)) time.sleep(0.1) def b(): # 任务B for i in range(5): print("B" + str(i)) time.sleep(0.1) def c(): # 任务C for i in range(5): print("C" + str(i)) time.sleep(0.1) if __name__ == '__main__': g1 = gevent.spawn(a) g2 = gevent.spawn(b) g3 = gevent.spawn(c) g1.join() g2.join() g3.join()
---------------------------------------------------------------------------------------------------------------------
import requests import gevent from gevent import monkey def download(url): response = requests.get(url) content = response.text print('下载了{}的数据,长度:{}'.format(url, len(content))) if __name__ == '__main__': urls = ['http://www.163.com', 'http://www.qq.com', 'http://www.baidu.com'] g1 = gevent.spawn(download, urls[0]) g2 = gevent.spawn(download, urls[1]) g3 = gevent.spawn(download, urls[2]) g1.join() g2.join() g3.join() # gevent.joinall(g1, g2, g3) 类似