一.协程

'''

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("主进程执行结束...")

二.协程例子

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

  1. python并发编程之协程知识点

    由线程遗留下的问题:GIL导致多个线程不能真正的并行,CPython中多个线程不能并行 单线程实现并发:切换+保存状态 第一种方法:使用yield,yield可以保存状态.yield的状态保存与操作系 ...

  2. Python的异步编程[0] -> 协程[0] -> 协程和 async / await

    协程 / Coroutine 目录 生产者消费者模型 从生成器到异步协程– async/await 协程是在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时 ...

  3. python全栈开发从入门到放弃之socket并发编程之协程

    一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...

  4. 32 python 并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  5. 四 python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  6. 百万年薪python之路 -- 并发编程之 协程

    协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...

  7. python并发编程之协程(实践篇)

    一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对于单线程下,我们不可避免程序中出现io操作,但如果我们 ...

  8. 第十篇.5、python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  9. 第 12 章 python并发编程之协程

    一.引子 主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只用一个)情况下实现并发,并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作 ...

随机推荐

  1. python面试的100题(1)

    题目:有一个jsonline格式的文件file.txt大小约为10K def get_lines(): with open('file.txt','rb') as f: return f.readli ...

  2. c/c++学习01

    c++指针初始赋值: //指针初始赋值 int* a = new int(3); //第二种赋值 int 初始值 = 100; int *b = &初始值; //由new分配的内存块通常使用过 ...

  3. 数据库程序接口——JDBC——功能第四篇——事务之Spring事务

    综述 事务的实现方式有三种,JTA,Spring事务,Web Container方式.本篇讲述Spring事务. Spring事务分为两个部分核心对象,Spring事务的实现方式. Spring事务实 ...

  4. Java - 闭包

    概述 简单介绍 闭包 1. 聚合关系 概述 常见的 类间关系 场景 类 A 主要类 持有 类B 的实例 有点行为, 需要 类 B 的介入 类 B 有自己的行为 A 会在某些时候调用 B 的行为 代码示 ...

  5. IDE - IDEA - 快捷键整理 - 01. Navigation

    1. 概述 工具的熟练程度, 会决定工作效率 总共也就 140 条左右吧 需要讲解吗? 2. ref 1. idea 自带的 ReferenceCard.pdf 3. keymap 1. 文件移动 C ...

  6. P & R 9

    Floorplan: 要做好floorplan需要掌握哪些知识跟技能? 明确Floorplan 处理的对象:对于数字设计的 Floorplan 来说,它是一个很依赖前后步骤的一个过程,这个可以看作是后 ...

  7. Docker容器里配置计划任务 crontab(DaoCloud+Docker +Laravel5)

    最近项目涉及到一个定时任务的功能,所以去这几天研究了一下 crontab 的使用方法,按照网上的相关教程顺利在自己的电脑上成功开启了这个功能 Laravel + crontab 添加 crontab ...

  8. vue项目用npm安装sass包遇到的问题及解决办法

    IDEA启动vue程序,浏览器访问时出现如下情况的关于node-sass的错误: 错误1: Module build failed (from ./node_modules/sass-loader/d ...

  9. 红帽RHCE培训-课程3笔记内容2

    9 NFS 9.1 NFS基础 目标 .使用NFS将文件系统连接到客户端,并使用IP 地址控制访问 .使用NFS将文件系统连接到客户端,并使用kerberos 来控制访问 .配置用户名和密码控制访问的 ...

  10. AI人工智能之基于OpenCV+face_recognition实现人脸识别

    因近期公司项目需求,需要从监控视频里识别出人脸信息.OpenCV非常庞大,其中官方提供的人脸模型分类器也可以满足基本的人脸识别,当然我们也可以训练自己的人脸模型数据,但是从精确度和专业程度上讲Open ...