python并发编程之协程
python并发编程之协程
1、协程:
单线程实现并发
在应用程序里控制多个任务的切换+保存状态
优点:
应用程序级别速度要远远高于操作系统的切换
缺点:
多个任务一旦有一个阻塞没有切,整个线程都阻塞在原地
该线程内的其他的任务都不能执行了
一旦引入协程,就需要检测单线程下所有的IO行为,
实现遇到IO就切换,少一个都不行,以为一旦一个任务阻塞了,整个线程就阻塞了,
其他的任务即便是可以计算,但是也无法运行了
2、协程序的目的:
想要在单线程下实现并发
并发指的是多个任务看起来是同时运行的
并发=切换+保存状态
#串行执行 # import time # # def func1(): # for i in range(10000000): # i+1 # # def func2(): # for i in range(10000000): # i+1 # # start = time.time() # func1() # func2() # stop = time.time() # print(stop - start)
#基于yield并发执行 # import time # def func1(): # while True: # print('func1') # yield # # def func2(): # g=func1() # for i in range(10000000): # print('func2') # i+1 # time.sleep(3) # next(g) # # # start=time.time() # func2() # stop=time.time() # print(stop-start)
对于单线程下,我们不可避免程序中出现io操作,但如果我们能在自己的程序中(即用户程序级别,而非操作系统级别)控制单线程下的多个任务能在一个任务遇到io阻塞时就切换到另外一个任务去计算,这样就保证了该线程能够最大限度地处于就绪态,即随时都可以被cpu执行的状态,相当于我们在用户程序级别将自己的io操作最大限度地隐藏起来,从而可以迷惑操作系统,让其看到:该线程好像是一直在计算,io比较少,从而更多的将cpu的执行权限分配给我们的线程。
协程的本质就是在单线程下,由用户自己控制一个任务遇到io阻塞了就切换另外一个任务去执行,以此来提升效率。为了实现它,我们需要找寻一种可以同时满足以下条件的解决方案:
#1. 可以控制多个任务之间的切换,切换之前将任务的状态保存下来,以便重新运行时,可以基于暂停的位置继续执行。#2. 作为1的补充:可以检测io操作,在遇到io操作的情况下才发生切换
#pip3 install gevent # from gevent import monkey,spawn;monkey.patch_all() # 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(1) # print('%s play 2' %name) # # start=time.time() # g1=spawn(eat,'egon') # g2=spawn(play,'zmy') # # g1.join() # g2.join() # print(time.time() - start) # print(g1) # print(g2)from gevent import monkey,spawn;monkey.patch_all() from threading import current_thread import timedef eat():print('%s eat 1' %current_thread().name)time.sleep(3)print('%s eat 2' %current_thread().name)def play():print('%s play 1' %current_thread().name)time.sleep(1)print('%s play 2' %current_thread().name)g1=spawn(eat,) g2=spawn(play,)print(current_thread().name) g1.join() g2.join()
转载于:https://www.cnblogs.com/hanbowen/p/9325701.html
python并发编程之协程相关推荐
- python并发编程:协程asyncio、多线程threading、多进程multiprocessing
python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...
- python并发之协程_python并发编程之协程
一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...
- python 异步编程:协程与 asyncio
文章目录 一.协程(coroutine) 1.1 协程的概念 1.2 实现协程的方式 二.asyncio 异步编程 2.1 事件循环 2.2 快速上手 2.3 运行协程 2.4 await 关键字 2 ...
- Java并发编程实战~协程
Golang 是一门号称从语言层面支持并发的编程语言,支持并发是 Golang 一个非常重要的特性.在上一篇文章<44 | 协程:更轻量级的线程>中我们介绍过,Golang 支持协程,协程 ...
- 3-Go并发编程与协程Goroutine
目录 一.并发编程 1 - 并行和并发 2 - 程序.进程.线程 3 - 进程并发 4 - 线程并发 5 - 线程同步 二.协程Coroutine 1 - 协程概念 2 - Go并发 3 - go程创 ...
- Python 异步编程之——协程
1.总则 多进程可以实现真正的并行,但进程间无法进行直接通信且占用资源较多.多线程的使用代价相对多进程较小,但为了解决数据安全问题引入了锁的机制.这又使得多线程并发度降低,同时,使用锁还可能造成死锁. ...
- Go 分布式学习利器(17)-- Go并发编程之协程机制:Grountine 原理及使用
文章目录 1. Thread VS Groutine 2. Groutine 调度原理 3. Groutine 示例代码 关于Go的底层实现还需要后续持续研究,文中如有一些原理描述有误,欢迎指证. 1 ...
- Golang并发编程-GPM协程调度模型原理及组成分析
文章目录 一.操作系统的进程和线程模型 1.1.基础知识 1.2.KST/ULT 二.Golang的GPM协程调度模型 三.M的结构及对应关系 四.P的结构及状态转换 五.G的结构及状态转换 六.GP ...
- Python并发编程之线程池/进程池
引言 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...
最新文章
- java jdk安装 以及myeclipse安装
- 如何提升测试环境的稳定性?来看看阿里内部的实践总结
- 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1065:奇数求和
- 拼多多与两大权威球鞋鉴别平台达成合作,为“多多潮鞋馆”提供“真香”认证...
- 史上最全的php面试题-带有答案,史上最全的PHP面试题-带有答案
- ORB-SLAM2双目开源框架 (4) LoopClosing解析
- 2022百度之星程序设计大赛 - 初赛 - 第二场 1001 和
- C语言 数据结构 实验二 线性表的链式存储及其操作
- java实现聊天室(GUI界面+私聊+群聊)
- AT89C2051烧写器的制做与调试
- 台式计算机有线无线网卡设置,笔记本/台式电脑有线网络转无线wifi教程
- Hard Link 与 Symbolic Link
- 介绍几款AI开源平台
- Android 开发常见问题汇总
- 华为机试:身高体重排序(仅有题,待求解)
- [转]开源大数据处理工具汇总
- wxc-cell使用
- 十三、添加RD 会话主机角色
- Traccar记录足迹-服务搭建及使用
- 萌卡纳我书飞翔公益捐书 守护阅读梦