协程介绍前戏、协程切换手动、协程切换自动

一、协程简介、引子

‘‘‘
协程:异步IO,队列,缓存
Nginx效率高就是用了异步IO
协程是一种用户态的轻量级线程。又称微线程,怎么理解呢?后面会说
CPU只认识线程,不会像线程一样吧上下文保存在CPU寄存器,协程是用户控制的。
协程能保留上一次调用时的状态,单线程下实现并发效果
协程的好处:
1、无需线程上下文切换的开销,用yield的时候,只是在函数之间来回切换
2、无需原子操作锁定及同步的开销,没有异步锁之类的东西,因为协程就是单线程
3、方便切换控制流,简化编程模型
4、高并发-高扩展-低成本,一个CPU支持上万个协程都不成问题
缺点:
1、由于是单线程的无法利用多核资源,协程本质上是单线程,
2、协程需要和进程配合才能运行在多CPU上,
3、协程阻塞时会阻塞整个程序
‘‘‘
# 回顾:自己之前写的yield协程,如果生产者里面sleep(1)秒速度变慢,可以理解,看下面
# 假设下面是Nginx,来了3个请求,请求切换应该在读数据库IO的地方切换
import time
def home():
    print("home")
    time.sleep(3)  # 读数据库
    print("home_end")

def bbs():
    print("bbs")
    time.sleep(2)  # 读数据库
    print("bbs_end")

def login():
    print("login")
    time.sleep(1)  # 写数据库
    print("login_end")

‘‘‘
协程之所以能处理大并发,因为遇到IO操作就切换,因为IO耗时
那么什么时候切回去呢??应该是IO完成就切回去。怎么让系统知道IO操作完了呢??
‘‘‘

二、协程切换手动挡

‘‘‘
需要安装gevent
ps:gevent是自动挡,由于自动挡封装了手动挡
   安装gevent之后,就自动有greenlet
greenlet是手动切换
‘‘‘
from greenlet import greenlet

def test1():
    print(12)
    gr2.switch()
    print(34)
    gr2.switch()

def test2():
    print(56)
    gr1.switch()
    print(78)

gr1 = greenlet(test1)  # 启动一个协程
gr2 = greenlet(test2)
gr1.switch()     # 类似于yield语句

‘‘‘
12
56
34
78
‘‘‘

三、协程切换自动挡

import gevent
‘‘‘
如果是time.sleep()就变成串行的了
‘‘‘

def foo():
    print("foo_begin")
    gevent.sleep(2)
    print("foo_end")
def bar():
    print("bar_begin")
    gevent.sleep(1)
    print("bar_end")
def func():
    print("func_begin")
    gevent.sleep(0)
    print("func_end")
gevent.joinall([gevent.spawn(foo),
                gevent.spawn(bar),
                gevent.spawn(func)])
‘‘‘
foo_begin
bar_begin
func_begin
func_end
bar_end
foo_end
‘‘‘

原文地址:https://www.cnblogs.com/staff/p/9704156.html

时间: 2024-08-29 00:20:37

协程介绍前戏、协程切换手动、协程切换自动的相关文章

#协程介绍及基本示例

1 #协程介绍及基本示例 2 3 #Gevent协程(单线程,串行)在线程里启动 4 ''' 5 协程,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程: 6 协程是一种用户态的轻量级线程. 7 8 协程拥有自己的寄存器上下文和栈.协程调度切换时, 9 将寄存器上下文和栈保存到其他地方,在切回来的时候, 10 恢复先前保存的寄存器上下文和栈.因此: 11 12 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合), 13 每次过程重入时,就相当于进入上一次调用的状态,换种

协程介绍

引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它. 操作系统将cpu的运行不断的在各个程序之中切换,以保证各个程序的并发执行.对于遇到io切换这样是能够提高效率,但是对于多个任务都是计算密集型的任务来说,不断的切换反

Python并发编程:协程介绍

一 引子 基于单线程来实现并发,即只用一个主线程(很明显可利用的CPU只有一个)情况下实现并发,先回顾一下并发的本质:切换+保存状态 CPU正在运行一个任务,会在两种情况下切走去执行其它的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 一:其中第二种情况并不能提升效率,只是让CPU能够雨露均沾,实现看起来所有任务

3-1 协程介绍

一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 一:其中第二种情况并不能提升效率,只是为了让cpu能够雨

Unity3D协程介绍 以及 使用

作者ChevyRay ,2013年9月28日,snaker7译  原文地址:http://unitypatterns.com/introduction-to-coroutines/ 在Unity中,协程(Coroutines)的形式是我最喜欢的功能之一,几乎在所有的项目中,我都会使用它来控制运动,序列,以及对象的行为.在这个教程中,我将会说明协程是如何工作的,并且会附上一些例子来介绍它的用法. 协程介绍 Unity的协程系统是基于C#的一个简单而强大的接口 ,IEnumerator,它允许你为自

【学神-RHEL7】1-1-课程介绍和RHEL7.1操作系统安装-VMware使用方法

本节所讲内容: 课程介绍 VMware workstation的基本使用 RHEL7 基本了解 RHEL7.1操作系统的安装 RHEL6.5操作系统的安装 实战:组装服务器   1U=4.45CM   HP    SAS   10K    450G    2100¥ Dell  SAS   10K    300G     1100¥     2100*8=16800¥ 1100*8=8800¥     RHEL7 基本了解 红帽公司于2014年6月11日正式发布企业Linux 7版本,该版本在裸

[Android] 任意时刻从子线程切换到主线程的实现原理及加强版

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/41900879 ========================================================

Android之——任意时刻从子线程切换到主线程的实现(插曲)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/45951149 一.引入 在Android开发中常常会遇到网络请求,数据库数据准备等一些耗时的操作:而这些操作是不允许在主线程中进行的.因为这样会堵塞主线程导致程序出现未响应情况. 所以只能另起一个子线程进行这些耗时的操作,完成后再显示到界面.众所周知,界面等控件操作只能在主线程中完成:所以不可避免的需要从子线程切换到主线程. 二.方法 对于这样的情况在Android 中比较常见的

[Android] 任意时刻从子线程切换到主线程的实现

======================================================== 作者:qiujuer 博客:blog.csdn.net/qiujuer 网站:www.qiujuer.net 开源库:Genius-Android 转载请注明出处:http://blog.csdn.net/qiujuer/article/details/41599383 ========================================================