协程

在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
进程
线程

1.协程的定义

  1. 协程,又称微线程,纤程,协程是一种用户态的轻量级线程。
  2. 线程的切换会保存到CPU的栈里,协程拥有自己的寄存器上下文和栈,
  3. 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈
  4. 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态
  5. 协程最主要的作用是在单线程的条件下实现并发的效果,但实际上还是串行的(像yield一样)

2. 协程缺点(无法利用多核资源)

协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上线程阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
3. 协程为何能处理大并发1:Greenlet遇到I/O手动切换

  1. 协程之所以快是因为遇到I/O操作就切换(最后只有CPU运算)
  2. 这里先演示用greenlet实现手动的对各个协程之间切换
  3. 其实Gevent模块仅仅是对greenlet的再封装,将I/O间的手动切换变成自动切换
  4. 协程为何能处理大并发2:Gevent遇到I/O自动切换
  5. Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程
  6. 在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程
  7. Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
  8. Gevent原理是只要遇到I/O操作就会自动切换到下一个协程
  9. 使用协程处理并发
    注:Gevent只用起一个线程,当请求发出去后gevent就不管,永远就只有一个线程工作,谁先回来先处理
    import gevent
    import requests
    from gevent import monkey

monkey.patch_all()

3.这些请求谁先回来就先处理谁

def fetch_async(method, url, req_kwargs):
response = requests.request(method=method, url=url, **req_kwargs)
print(response.url, response.content)

4. 发送请求

gevent.joinall([
gevent.spawn(fetch_async, method=‘get’, url=‘https://www.python.org/’, req_kwargs={}),
gevent.spawn(fetch_async, method=‘get’, url=‘https://www.google.com/’, req_kwargs={}),
gevent.spawn(fetch_async, method=‘get’, url=‘https://github.com/’, req_kwargs={}),
])

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值