协程模块
1.协程的概念
操作系统不可见的
协程本质就是一条线程,多个任务在一条线程上切换,来规避IO操作,就达到了我们将一条线程中IO操作降到最低的目标
2. 切换 并 规避 IO的两个模块
gevent 利用了greentlet (C语言) 底层模块完成切换 + 自动规避io的功能
asyncio 利用了 yeild 底层语法完成的切换 + 自动规避io的功能
python中提供协程功能的关键字 : asynic ,await
进程 数据隔离 数据不安全 操作系统级别的 能利用多核
线程 数据共享 数据不安全 操作系统级别的 不能利用多核 对IO操作,文件相关的只有操作系统能感知到
协程 数据共享 数据安全 用户级别的 不能利用多核 只有在用户级别能感知到的io ,socker
使用 gevent 实现协程模块 :
from gevent import monkey monkey.patch_all() import time import gevent def func(name): print('开始了',name) time.sleep(1) print('结束了',name) g1 = gevent.spawn(func,'dong') g2 = gevent.spawn(func,'ting') gevent.joinall([g1,g2])
如何检测 能否规避某个模块的io操作呢?
#一般进程开启个数 cpu个数+1 #线程 开启个数 cpu个数*5 #协程 开启个数 cpu*100 #======== import socket print(socket.socket) #在pacth_all 之前打印一次 from gevent import monkey monkey.patch_all() import socket import gevent print(socket.socket) #在patch_all 后面打印一次,如果两次结果不一样可以开协程
使用 asyncio 模块实现简单的协程例子:
import asyncio async def func(name): print('%s start'%name) await asyncio.sleep(1) print('%s end'%name) Loop = asyncio.get_event_loop() Loop.run_until_complete(asyncio.wait([func('太菜'),func('haha')]))

浙公网安备 33010602011771号