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("主进程执行结束...")
二.协程例子
Python 之并发编程之协程的更多相关文章
- python并发编程之协程知识点
由线程遗留下的问题:GIL导致多个线程不能真正的并行,CPython中多个线程不能并行 单线程实现并发:切换+保存状态 第一种方法:使用yield,yield可以保存状态.yield的状态保存与操作系 ...
- Python的异步编程[0] -> 协程[0] -> 协程和 async / await
协程 / Coroutine 目录 生产者消费者模型 从生成器到异步协程– async/await 协程是在一个线程执行过程中可以在一个子程序的预定或者随机位置中断,然后转而执行别的子程序,在适当的时 ...
- python全栈开发从入门到放弃之socket并发编程之协程
一.为什么会有协程 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情 ...
- 32 python 并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- 四 python并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- 百万年薪python之路 -- 并发编程之 协程
协程 一. 协程的引入 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两 ...
- python并发编程之协程(实践篇)
一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对于单线程下,我们不可避免程序中出现io操作,但如果我们 ...
- 第十篇.5、python并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- 第 12 章 python并发编程之协程
一.引子 主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只用一个)情况下实现并发,并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作 ...
随机推荐
- input的number类型只能输入正数,禁止负数输入
<input type="number" max="10" min='1' id='number'> <script> document ...
- async+队列queue.Queue()
import queue import time import random import threading import asyncio import logging logging.basicC ...
- Java_Habse_shell
import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.*; import org.apache.had ...
- Django框架之ORM的相关操作(一)
一.一般操作 from django.db import models import datetime # Create your models here. class Author(models.M ...
- Apache的虚拟主机功能(基于IP地址、基于虚拟主机、基于端口)
1. 安装Apache服务程序(系统用户,1-199之间) 第一步:在虚拟机软件里选中光盘镜像: 第二步:将光盘设备挂载到/media/cdrom目录 输入:mkdir -p /media/cdrom ...
- Smart License
思科启动了通过构建思科智能软件管理器门户来简化客户许可管理的计划. 它可以帮助客户了解他们购买的许可证以及他们使用的许可证. 其他各种思科产品已经启用Smart Enabled,随着此版本(我这里学习 ...
- windows C++ 网络编程
转载:https://blog.csdn.net/yao_hou/article/details/91400832 https://blog.csdn.net/Ctrl_qun/article/li ...
- mysql带条件的计数
在网站开发的过程中,经常会用到数据统计功能,因此条件计数查询便是不可避免的,下面介绍几种方法来解决此问题. 例(假设): mysql> select * from count_demo; +-- ...
- P2141
总算过了,看了题解才知道是因为重复的不算,比如 1 + 4.4 + 1.2 + 3.3 + 2 都是重复,也就是结果相同的不同的两个数只能出现一组.于是加上判断就好. #include <bit ...
- python匿名函数与三元运算
匿名函数 匿名函数就是不需要显示式的指定函数名 首先看一行代码: def calc(x,y): return x*y print(calc(2,3)) # 换成匿名函数 calc = lambda ...