Python 之并发编程之协程

一.协程

‘‘‘

def gen():

for i in range(10):

yield i

# 初始化生成七函数 返回生成器对象,简称生成器

mygen = gen()

for i in mygen:

print(i)

‘‘‘

# (1) 用协程改写成生产者消费者

‘‘‘

def producer():

for i in range(100):

yield i

def consumer():

g = producer()

for i in g:

print(i)

‘‘‘

# (2) 协程的具体实现

from greenlet import greenlet

import time

‘‘‘

switch 利用它进行任务的切块,一般在阻塞的时候切块

只能默认手动切换

缺陷: 不能规避io,不能自动实现遇到阻塞就切换

‘‘‘

"""

def eat():

print("eat one")

# 手动切换play这个协程中

g2.switch()

time.sleep(1)

print("eat two")

def play():

print("play one")

time.sleep(1)

print("play two")

g1.switch()

g1 = greenlet(eat)

g2 = greenlet(play)

g1.switch()

‘‘‘

eat one

play one

play two

eat two

‘‘‘

"""

# (3) 缺陷:gevent不能够识别time.sleep 是阻塞

"""

import gevent

# gevent 其中有一个spawn 类似于switch ,也是切换任务的

import time

def eat():

print("eat one")

time.sleep(1)

print("eat two")

def play():

print("play one")

time.sleep(1)

print("play two")

# 利用gevent 创建协程对象g1

g1 = gevent.spawn(eat)

#利用gevent创建协程对象g2

g2 = gevent.spawn(play)

# 协程的阻塞是join 等待当前协程执行完毕之后,再向下执行

g1.join()  #阻塞直到g1协程执行完毕

g2.join()  #阻塞直到g2协程执行完毕

print("主线程执行完毕")

"""

# (4) 进阶 用gevent.sleep 来取代time.sleep()

‘‘‘

import gevent

def eat():

print("eat one")

gevent.sleep(1)

print("eat two")

def play():

print("play one")

gevent.sleep(1)

print("play two")

g1 = gevent.spawn(eat)

g2 = gevent.spawn(play)

g1.join()

g2.join()

print("主线程执行完毕")

‘‘‘

# (5) 终极解决识别问题

# spawn gevent 中spawn 遇到阻塞会自动切换协程任务

from gevent import monkey

# 把patch_all 下面引入的所有模块中的阻塞识别出来

monkey.patch_all()

import time

import gevent

def eat():

print("eat one")

time.sleep(1)

print("eat two")

def play():

print("play one")

time.sleep(1)

print("play two")

g1 = gevent.spawn(eat)

g2 = gevent.spawn(play)

g1.join()

g2.join()

print("主进程执行结束...")

二.协程例子

原文地址:https://www.cnblogs.com/hszstudypy/p/11294608.html

时间: 2024-10-06 16:30:43

Python 之并发编程之协程的相关文章

python并发编程之---协程

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

python并发编程之协程

阅读目录 一 引子 二 协程介绍 三 Greenlet 四 Gevent介绍 五 Gevent之同步与异步 六 Gevent之应用举例一 七 Gevent之应用举例二 一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长 ps:在介绍进程理论时,提

Python并发编程:协程介绍

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

Python学习:python并发编程之协程

本节内容: 1.协程介绍. 2.回顾yield 3.Greenlet 4.Gevent介绍 5.Gevent之同步与异步 6.Gevent之应用举例一 7.Gevent应用举例二 一.引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长 ps:在介绍进

并发编程之协程

对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算,这样就保证了该线程能够最大限度地处于就绪态,即随时都可以被cpu执行的状态,相当于我们在用户程序级别将自己的io操作最大限度地隐藏起来,从而可以迷惑操作系统,让其看到:该线程好像是一直在计算,io比较少,从而更多的将cpu的执行权限分配给我们的线程. 协程的本质就是在单线程下,由用户自己控制一个任务遇到io阻塞了就

网络编程进阶:并发编程之协程、IO模型

协程: 基于单线程实现并发,即只用一个主线程(此时可利用的CPU只有一个)情况下实现并发: 并发的本质:切换+保存状态 CPU正在运行一个任务,会在两种情况下切走去执行其他任务(切换有操作系统强制控制),一种情况是该任务发生了阻塞,另一种是该任务计算的时间过长或有一个优先级更高的程序替代了它 在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 如果多个任务都是纯计算的,上图的情况2并不能提升效率,因为只是让CPU来回切,这样看起来所有任务都被"同时

Python的异步编程[0] -> 协程[1] -> 使用协程建立自己的异步非阻塞模型

使用协程建立自己的异步非阻塞模型 接下来例子中,将使用纯粹的Python编码搭建一个异步模型,相当于自己构建的一个asyncio模块,这也许能对asyncio模块底层实现的理解有更大的帮助.主要参考为文末的链接,以及自己的补充理解. 完整代码 1 #!/usr/bin/python 2 # ============================================================= 3 # File Name: async_base.py 4 # Author: L

python 高性能编程之协程

用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣.为了异步,我们曾使用多线程编程.然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程编程的高出错风险,"协程 + 多进程"的组合渐渐被认为是未来发展的方向.技术容易更新,思维转变却需要一个过渡.我之前在异步事件处理方面已经习惯了回调 + 多线程的思维方式,转换到协程还非常的不适应.这几天我非常艰难地查阅了一些资料并思考,得出了一个可能并不可靠的总结.尽管这个

网络编程之协程——gevent模块

网络编程之协程--gevent模块 gevent模块 安装 pip3 install gevent Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程. Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度. #用法 g1=gevent.spawn(func,1,,2,3,x=4,y=5)创建一个协程对象g1,spawn括号内第一个参数是函数名,如e