一 gevent模块

gevent应用场景:

单线程下,多个任务,io密集型程序

安装

pip3 install gevent

Gevent 是一个第三方库,可以轻松通过gevent实现并发同步或异步编程,在gevent中用到的主要模式是Greenlet, 它是以C扩展模块形式接入Python的轻量级协程。 Greenlet全部运行在主程序操作系统进程的内部,但它们被协作式地调度。

gevent可以检测io,实现遇到io自动切换另外一个任务

#用法
g1=gevent.spawn(func,1,2,3,x=4,y=5)
创建一个协程对象g1,spawn括号内第一个参数是函数名,如eat,后面可以有多个参数,可以是位置实参或关键字实参,都是传给函数eat的 g2=gevent.spawn(func2) g1.join() #等待g1结束 g2.join() #等待g2结束 #或者上述两步合作一步:gevent.joinall([g1,g2]) g1.value#拿到func1的返回值

遇到io立刻 切换到另外一个任务,这是使用gevent.sleep 自己产生的io操作

import gevent
import time def eat(name):
print("%s:eat 1" %name)
gevent.sleep(3)
print("%s:eat 2" %name) def play(name):
print("%s:play 1" % name)
gevent.sleep(4)
print("%s:play 2" % name) g1 = gevent.spawn(eat,"mike")
g2 = gevent.spawn(play,"mike") start_time = time.time()
g1.join()
g2.join() end_time = time.time()
print(end_time-start_time) '''
mike:eat 1
mike:play 1
mike:eat 2
mike:play 2
4.0012290477752686
'''

而time.sleep(2)或其他的阻塞,gevent是不能直接识别的,遇到io不切换另外一个任务

gevent模块 只能识别自己模拟的io操作,其他io操作无法识别

import gevent
import time def eat(name):
print("%s:eat 1" %name)
time.sleep(3)
print("%s:eat 2" %name) def play(name):
print("%s:play 1" % name)
time.sleep(4)
print("%s:play 2" % name) g1 = gevent.spawn(eat,"mike")
g2 = gevent.spawn(play,"mike") start_time = time.time()
g1.join()
g2.join() end_time = time.time()
print(end_time-start_time) '''
mike:eat 1
mike:eat 2
mike:play 1
mike:play 2
7.0004003047943115
'''

需要用下面一行代码,打补丁,就可以识别了,

from gevent import monkey;monkey.patch_all()必须放到被打补丁者的前面,如time,socket模块之前

或者我们干脆记忆成:要用gevent,需要将from gevent import monkey;monkey.patch_all()放到文件的开头

把monkey.pathch_all() 下面所有代码的涉及到io阻塞操作都打个标记,变成非阻塞操作,让gevent可以识别

这样就可以检测到io操作

from gevent import monkey;monkey.patch_all()
import gevent
import time def eat(name):
print("%s:eat 1" %name)
time.sleep(3)
print("%s:eat 2" %name) def play(name):
print("%s:play 1" % name)
time.sleep(4)
print("%s:play 2" % name) g1 = gevent.spawn(eat,"mike")
g2 = gevent.spawn(play,"mike") start_time = time.time()
g1.join()
g2.join() end_time = time.time()
print(end_time-start_time) '''
mike:eat 1
mike:play 1
mike:eat 2
mike:play 2
4.032230854034424
'''

join()  主线程等待任务运行完后才销毁

joinall()  等待多个任务 用列表存放任务

from gevent import monkey;monkey.patch_all()
import gevent
import time def eat(name):
print("%s:eat 1" %name)
time.sleep(3)
print("%s:eat 2" %name) def play(name):
print("%s:play 1" % name)
time.sleep(4)
print("%s:play 2" % name) g1 = gevent.spawn(eat,"mike")
g2 = gevent.spawn(play,"mike") gevent.joinall([g1,g2])

python 并发编程 协程 gevent模块的更多相关文章

  1. python 并发编程 协程 greenlet模块

    一 greenlet模块 不敢是yield,还是greenlet都没有实现检测io,实现遇到io切换效果 如果我们在单个线程内有20个任务,要想实现在多个任务之间切换,使用yield生成器的方式过于麻 ...

  2. python 并发编程 协程 目录

    python 并发编程 协程 协程介绍 python 并发编程 协程 greenlet模块 python 并发编程 协程 gevent模块 python 并发编程 基于gevent模块实现并发的套接字 ...

  3. python并发编程&协程

    0x01 前导 如何基于单线程来实现并发? 即只用一个主线程(可利用的cpu只有一个)情况下实现并发: 并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操 ...

  4. Python并发编程协程(Coroutine)之Gevent

    Gevent官网文档地址:http://www.gevent.org/contents.html 基本概念 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译 ...

  5. 14 并发编程-(协程)-greenlet模块&gevent模块

    1.实现多个任务之间进行切换,yield.greenlet都没有实现检测I/O,greenlet在实现多任务切换下更简单 from greenlet import greenlet def eat(n ...

  6. 并发编程~~~协程~~~greenlet模块, gevent模块

    一 协程 1. 协程: 单线程下的并发,又称微线程,纤程.协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 并发真正的核心: 切换并且保持状态. 开启协程并发的执行,自己的程序把控着C ...

  7. Python之路【第十七篇】:Python并发编程|协程

    一.协程 协程,又叫微线程,纤程.英文名Coroutine.协程本质上就是一个线程 优点1:协程极高的执行效率.因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线 ...

  8. python 并发编程 协程 协程介绍

    协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是线程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的 需要强调的是: 1. python的线程属于内 ...

  9. Python并发编程-协程

    利用Greenlet模块在多线程之间切换 from greenlet import greenlet def eat(): print('eating start') g2.switch() prin ...

随机推荐

  1. mysql常用查询命令

    转引自:https://www.cnblogs.com/widows/p/7137184.html 常用mysql命令 show variables like 'character_set_clien ...

  2. matplotlib 模块

    目录 matplotlib 模块 1.条形图 2.直方图 3.折线图 4.散点图+直线图 5.饼图 6. plot 函数参数 7.图像标注参数 matplotlib 模块 1.条形图 import m ...

  3. [深度学习] pytorch学习笔记(1)(数据类型、基础使用、自动求导、矩阵操作、维度变换、广播、拼接拆分、基本运算、范数、argmax、矩阵比较、where、gather)

    一.Pytorch安装 安装cuda和cudnn,例如cuda10,cudnn7.5 官网下载torch:https://pytorch.org/ 选择下载相应版本的torch 和torchvisio ...

  4. hdu 3917 修路与公司 最大权闭合图 好题

    Road constructions Time Limit: 6000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  5. HDU 5249:KPI(权值线段树)

    KPI Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Desc ...

  6. python 随机数详细使用,推到以及字符串,双色球小程序

    #随机数的使用import random #导入randomrandom.randint(0,9)#制定随机数0到9i=random.sample(range(1,34),6)#输出6个随机数,范围是 ...

  7. 理解PyTorch的自动微分机制

    参考Getting Started with PyTorch Part 1: Understanding how Automatic Differentiation works 非常好的文章,讲解的非 ...

  8. winscp连接后目录名称乱码

    1.点击[编辑](点后变为保存按钮)按钮,高级按钮变为可用,点击[高级] 2.文件名utf-8编码,默认为“自动”,勾选为“开启”

  9. C++入门经典-例2.11-流输出小数控制

    1:代码如下: // 2.11.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <iostream> usin ...

  10. Docker非常详细的讲解

    CSDN大牛写的,推荐 http://blog.csdn.net/tangtong1/article/details/53556129 阿里云docker镜像地址: https://dev.aliyu ...