#协程介绍及基本示例

  1 #协程介绍及基本示例
  2
  3 #Gevent协程(单线程,串行)在线程里启动
  4 ‘‘‘
  5 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程:
  6         协程是一种用户态的轻量级线程。
  7
  8 协程拥有自己的寄存器上下文和栈。协程调度切换时,
  9         将寄存器上下文和栈保存到其他地方,在切回来的时候,
 10         恢复先前保存的寄存器上下文和栈。因此:
 11
 12 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),
 13         每次过程重入时,就相当于进入上一次调用的状态,换种说法:
 14         进入上一次离开时所处逻辑流的位置。
 15
 16 协程的好处:
 17
 18 1无需线程上下文切换的开销
 19
 20 2无需原子操作锁定及同步的开销
 21   "原子操作(atomic operation)是不需要synchronized",
 22     所谓原子操作是指不会被线程调度机制打断的操作;
 23     这种操作一旦开始,就一直运行到结束,
 24     中间不会有任何 context switch (切换到另一个线程)。
 25     原子操作可以是一个步骤,也可以是多个操作步骤,
 26     但是其顺序是不可以被打乱,或者切割掉只执行部分。
 27     视作整体是原子性的核心。
 28
 29 3方便切换控制流,简化编程模型
 30
 31 4高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。
 32     所以很适合用于高并发处理。
 33
 34
 35 缺点:
 36
 37 1无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,
 38         协程需要和进程配合才能运行在多CPU上.
 39         当然我们日常所编写的绝大部分应用都没有这个必要,
 40         除非是cpu密集型应用。
 41
 42 2进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序
 43
 44
 45 ‘‘‘
 46 ‘‘‘
 47 #使用yield实现协程操作例子
 48
 49 import time
 50 import queue
 51 def consumer(name):
 52     print("--->starting eating baozi...")
 53     while True:
 54         new_baozi = yield  #返回,唤醒接收数据
 55         print("[%s] is eating baozi %s" % (name,new_baozi))
 56         #time.sleep(1)
 57
 58 def producer():
 59
 60     r = con.__next__()
 61     r = con2.__next__()
 62     n = 0
 63     while n < 5:
 64         n +=1
 65         con.send(n)#send 的作用唤醒传递数据yield
 66         con2.send(n)
 67         print("1m[producer] is making baozi %s" %n )
 68
 69
 70 if __name__ == ‘__main__‘:
 71     con = consumer("c1")
 72     con2 = consumer("c2")
 73     p = producer()
 74
 75 ‘‘‘
 76 ‘‘‘
 77 #举例
 78 import time
 79 def home():
 80     print(‘in func 1‘)
 81     time.sleep(5)
 82     print(‘home exec done‘)
 83
 84 def bbs():
 85     print(‘in func 2‘)
 86     time.sleep(2)
 87 ‘‘‘
 88
 89 #greenlet 已经封装好的协程
 90 #io操作就切换
 91
 92 ‘‘‘
 93 greenlet是一个用C实现的协程模块,
 94     相比与python自带的yield,它可以使你在任意函数之间随意切换,
 95     而不需把这个函数先声明为generator
 96
 97 ‘‘‘
 98 ‘‘‘
 99 # -*- coding:utf-8 -*-
100 from greenlet import greenlet
101
102
103 def test1():
104     print(12)
105     gr2.switch()
106     print(34)
107     gr2.switch()
108
109
110 def test2():
111     print(56)
112     gr1.switch()
113     print(78)
114
115
116 gr1 = greenlet(test1)#启动一个协程
117 gr2 = greenlet(test2)
118 gr1.switch()
119 ‘‘‘
120
121
122 #Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,
123 #    在gevent中用到的主要模式是Greenlet,
124 #    它是以C扩展模块形式接入Python的轻量级协程。
125 #    Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。
126
127
128 import gevent
129
130 def func1():
131     print(‘\033[31;1m李闯在跟海涛搞...\033[0m‘)
132     gevent.sleep(2)
133     print(‘\033[31;1m李闯又回去跟继续跟海涛搞...\033[0m‘)
134
135 def func2():
136     print(‘\033[32;1m李闯切换到了跟海龙搞...\033[0m‘)
137     gevent.sleep(1)
138     print(‘\033[32;1m李闯搞完了海涛,回来继续跟海龙搞...\033[0m‘)
139
140
141 gevent.joinall([
142     gevent.spawn(func1),
143     gevent.spawn(func2),
144     #gevent.spawn(func3),
145 ])
时间: 2024-07-30 07:47:48

#协程介绍及基本示例的相关文章

Unity3D协程介绍 以及 使用

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

协程介绍

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

Python并发编程:协程介绍

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

3-1 协程介绍

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

lua编程之协程介绍

一,lua协程简介 协程(coroutine),意思就是协作的例程,最早由Melvin Conway在1963年提出并实现.跟主流程序语言中的线程不一样,线程属于侵入式组件,线程实现的系统称之为抢占式多任务系统,而协程实现的多任务系统成为协作式多任务系统.线程由于缺乏yield语义,所以运行过程中不可避免需要调度,休眠挂起,上下文切换等系统开销,还需要小心使用同步机制保证多线程正常运行.而协程的运行指令系列是固定的,不需要同步机制,协程之间切换也只涉及到控制权的交换,相比较线程来说是非常轻便的.

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

一.协程简介.引子 ''' 协程:异步IO,队列,缓存 Nginx效率高就是用了异步IO 协程是一种用户态的轻量级线程.又称微线程,怎么理解呢?后面会说 CPU只认识线程,不会像线程一样吧上下文保存在CPU寄存器,协程是用户控制的. 协程能保留上一次调用时的状态,单线程下实现并发效果 协程的好处: 1.无需线程上下文切换的开销,用yield的时候,只是在函数之间来回切换 2.无需原子操作锁定及同步的开销,没有异步锁之类的东西,因为协程就是单线程 3.方便切换控制流,简化编程模型 4.高并发-高扩

python 并发编程 协程 协程介绍

协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的 需要强调的是: 1. python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其他线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(!!!非io操作的切换与效率无关) 对比操作系统控制线程的切换,用户在单线程内控制协程的切换

协程、 Select\Poll\Epoll异步IO、事件驱动 介绍

一.协程介绍

python全栈开发基础【第二十六篇】(concurrent.futures模块、协程、Greenlet、Gevent)

注意 1.不能无限的开进程,不能无限的开线程最常用的就是开进程池,开线程池.其中回调函数非常重要回调函数其实可以作为一种编程思想,谁好了谁就去掉 2.只要你用并发,就会有锁的问题,但是你不能一直去自己加锁吧那么我们就用QUEUE,这样还解决了自动加锁的问题由Queue延伸出的一个点也非常重要的概念.以后写程序也会用到这个思想.就是生产者与消费者问题 一.Python标准模块--concurrent.futures(并发未来) concurent.future模块需要了解的 1.concurent