一 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. linux运维、架构之路-Kubernetes基础(一)

    一.Kubernetes介绍 Kubernetes最初源于谷歌内部的Borg,提供了面向应用的容器集群部署和管理系统.Kubernetes的目标旨在消除编排物理/虚拟计算,网络和存储基础设施的负担,并 ...

  2. 22. ClustrixDB 杀掉恶意会话

    ClustrixDB提供了几种机制来识别消耗大量系统资源的查询.这样的查询通常是应用程序索引不良或错误的结果. ClustrixDB支持以下语法来杀死查询: KILL [QUERY | CONNECT ...

  3. C# AVI Image 转换

    AVI视频库 http://download.csdn.net/download/qc_id_01/9970151 Avi视频文件的编码有很多,这个库只支持部分Avi文件,有些Avi文件不支持,具体哪 ...

  4. vue 修饰符sync

    从 Vue 2.3.0 起,重新引入了 .sync 修饰符,作为一个编译时的语法糖存在.它会被扩展为一个自动更新父组件属性的 v-on 监听器. 实例: 父组件:<syTree :refillD ...

  5. day_work_02

    day_work_02 ------Python是一个优雅的大姐姐 作业一 设计思路(四个if一个while) 首先我先把商品用列表加元组的形式保存,然后将商品遍历出来. 键盘输入薪水. (if)判断 ...

  6. java支持断点续传文件上传和下载组件

    java两台服务器之间,大文件上传(续传),采用了Socket通信机制以及JavaIO流两个技术点,具体思路如下: 实现思路: 1.服:利用ServerSocket搭建服务器,开启相应端口,进行长连接 ...

  7. HGOI 20190705 题解

    Problem A 树状数组 给出数x,一直执行x = x and (x+1)-1 直到 x=0 为止 询问这个数执行运算的次数. 这个数以二进制的形式表述出 x = s1 & s2 .... ...

  8. TensorFlow使用记录 (二): 理解tf.nn.conv2d方法

    方法定义 tf.nn.conv2d(input, filter, strides, padding, use_cudnn_on_gpu=True, data_format="NHWC&quo ...

  9. Linux 简单打印日志(二)

    #include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> //# ...

  10. Github 已经托管超过 1000 万个项目库

    2013 年对 Github 来说是不可思议和富有成效的一年,几天前 Github.com 上托管的项目已经超过 1000 万. 在此之前,首个 100 万项目用了将近 4 年时间,具体是 3 年 8 ...