单线程实现并发——协程,gevent模块
一 并发的本质
1 切换
2 保存状态
二 协程的概念
协程,又称微线程,纤程。英文名Coroutine。单线程下实现并发,用户从应用程序级别控制单线程下任务的切换,注意一定是遇到I/O才切。
协程的特点在于是一个线程执行,那和多线程比,协程有何优势?
最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
三 gevent模块
gevent是一个基于协程的Python网络库。
需要导入猴子补丁。
方法:
g1=gevent.spawn(func,):提交任务。 生成g1,是Greenlet类
gevent.sleep():睡
gevent.joinall(可迭代对象):阻塞,知道所有选中的任务执行完毕。
g1.join()
g1.value 获取由func函数生成Greenlet类的返回值。
import gevent from gevent import monkey;monkey.patch_all() from threading import current_thread import time def foo():print('%s is running ' % current_thread().getName())time.sleep(1)print('%s is done '%current_thread().getName()) def bar():print('%s is running ' % current_thread().getName())time.sleep(2)print('%s is done ' % current_thread().getName())g1=gevent.spawn(foo) g2=gevent.spawn(bar) print('g1',g1) print('g2',g2)# g1.join() # g2.join() gevent.joinall([g1,g2])
输出:
g2 <Greenlet at 0x26d7aff0898: bar> DummyThread-1 is running DummyThread-2 is running DummyThread-1 is done DummyThread-2 is done
转载于:https://www.cnblogs.com/654321cc/p/7681157.html
单线程实现并发——协程,gevent模块相关推荐
- python gevent async_详解python之协程gevent模块
进程.线程.协程区分 我们通常所说的协程Coroutine其实是corporate routine的缩写,直接翻译为协同的例程,一般我们都简称为协程. 在linux系统中,线程就是轻量级的进程,而我们 ...
- python协程处理海量文件_python_实战篇_使用协程gevent模块实现多任务copyA文件夹到B文件夹...
大家好,我是金鱼座,一个走在测试领域这片蓝海中, 蹉跎前行的技术渣渣,唯有一直走下去,也许能改变点什么,加油! 接着上次的通过多进程来实现多任务处理,本次使用gevent来实现协程的多任务处理 闲话不 ...
- Python并发之协程gevent基础
基本示例 from gevent import monkey monkey.patch_all() # 记住一定放在第一行,这里是打补丁的意思,time模块在使用协程gevent模块的时候,必须打补丁 ...
- python 协程池gevent.pool_进程池\线程池,协程,gevent
目录 1. 进程池与线程池 2. 协程 3. gevent 4. 单线程下实现并发的套接字通信 首先写一个基于多线程的套接字 服务端: from socket import * from thread ...
- 爬虫的单线程+多任务异步协程:asyncio 3.6
单线程+多任务异步协程:asyncio 3.6 事件循环 无限循环的对象.事件循环中最终需要将一些 特殊的函数(被async关键字修饰的函数) 注册在该对象中. 协程 本质上是一个对象.可以把协程对象 ...
- 爬虫第四章 单线程+多任务异步协程
单线程+多任务异步协程: asyncio 事件循环 loop: 无限循环的对象,事件循环中最终需要将一些特殊的函数注册到该事件循环中特殊的函数: 被ansyc关键字修饰的函数协程: 本质上是一个对象, ...
- Golang并发模型:合理退出并发协程
goroutine作为Golang并发的核心,我们不仅要关注它们的创建和管理,当然还要关注如何合理的退出这些协程,不(合理)退出不然可能会造成阻塞.panic.程序行为异常.数据结果不正确等问题.这篇 ...
- Python 协程gevent
gevent是第三方库,通过greenlet实现协程,其基本思想是: 当一个greenlet遇到IO操作时,比如访问网络,就自动切换到其他的greenlet,等到IO操作完成,再在适当的时候切换回来继 ...
- Python并发之协程gevent基础(5)
1,gevent介绍 gevent是第三方库,通过 greenlet 实现 coroutine,创建.调度的开销比 线程(thread) 还小,因此程序内部的 执行流 效率高. gevent 实现了 ...
最新文章
- mysql分页案例_php+mysql 进行分页案例
- mvc在页面上显示PDF
- 10、软件质量工程师指南 - 软件项目角色指南系列文章
- linux的 su 错误 Permission denied 和 Incorrect pa...
- Spring使用JPA进行Dao层的数据访问以及事务管理
- 20150210--Smarty1-02
- teamspeak3服务器搭建_教你快速便捷的搭建Teamspeak 3 服务器和基友开黑必备!
- CIO众论:转型路径和新技术实践
- 六种异常处理的陋习(转自http://www.blogjava.net/freeman1984/archive/2007/09/27/148850.html)...
- 大厂Sketch组件库源文件
- JAVA常见字符编码表
- 日常笔记-snownlp情感分析计算情感得分
- 时间管理(3:SMART原则)
- 深度学习对抗鲁棒性基础
- chatbot_我如何通过帮助我的ChatBot理解意图来使其变得更聪明
- java毕业生设计医保局综合办公系统计算机源码+系统+mysql+调试部署+lw
- CSDN的markdown编辑器的语法:字体的样式、大小、颜色怎么调节?建议收藏,让你的博客更漂亮
- 计算机视觉学习资料汇总
- Linux中常见的web中间件
- 你知道PS是什么吗?让我们一起来认识PS