协程模块

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

 

posted @ 2021-02-06 13:02  苦行僧冬*婷  阅读(37)  评论(0)    收藏  举报