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并发编程之协程相关推荐

  1. python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...

  2. python并发之协程_python并发编程之协程

    一 引子 本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去 ...

  3. python 异步编程:协程与 asyncio

    文章目录 一.协程(coroutine) 1.1 协程的概念 1.2 实现协程的方式 二.asyncio 异步编程 2.1 事件循环 2.2 快速上手 2.3 运行协程 2.4 await 关键字 2 ...

  4. Java并发编程实战~协程

    Golang 是一门号称从语言层面支持并发的编程语言,支持并发是 Golang 一个非常重要的特性.在上一篇文章<44 | 协程:更轻量级的线程>中我们介绍过,Golang 支持协程,协程 ...

  5. 3-Go并发编程与协程Goroutine

    目录 一.并发编程 1 - 并行和并发 2 - 程序.进程.线程 3 - 进程并发 4 - 线程并发 5 - 线程同步 二.协程Coroutine 1 - 协程概念 2 - Go并发 3 - go程创 ...

  6. Python 异步编程之——协程

    1.总则 多进程可以实现真正的并行,但进程间无法进行直接通信且占用资源较多.多线程的使用代价相对多进程较小,但为了解决数据安全问题引入了锁的机制.这又使得多线程并发度降低,同时,使用锁还可能造成死锁. ...

  7. Go 分布式学习利器(17)-- Go并发编程之协程机制:Grountine 原理及使用

    文章目录 1. Thread VS Groutine 2. Groutine 调度原理 3. Groutine 示例代码 关于Go的底层实现还需要后续持续研究,文中如有一些原理描述有误,欢迎指证. 1 ...

  8. Golang并发编程-GPM协程调度模型原理及组成分析

    文章目录 一.操作系统的进程和线程模型 1.1.基础知识 1.2.KST/ULT 二.Golang的GPM协程调度模型 三.M的结构及对应关系 四.P的结构及状态转换 五.G的结构及状态转换 六.GP ...

  9. Python并发编程之线程池/进程池

    引言 Python标准库为我们提供了threading和multiprocessing模块编写相应的多线程/多进程代码,但是当项目达到一定的规模,频繁创建/销毁进程或者线程是非常消耗资源的,这个时候我 ...

最新文章

  1. java jdk安装 以及myeclipse安装
  2. 如何提升测试环境的稳定性?来看看阿里内部的实践总结
  3. 信息学奥赛一本通(C++)在线评测系统——基础(一)C++语言—— 1065:奇数求和
  4. 拼多多与两大权威球鞋鉴别平台达成合作,为“多多潮鞋馆”提供“真香”认证...
  5. 史上最全的php面试题-带有答案,史上最全的PHP面试题-带有答案
  6. ORB-SLAM2双目开源框架 (4) LoopClosing解析
  7. 2022百度之星程序设计大赛 - 初赛 - 第二场 1001 和
  8. C语言 数据结构 实验二 线性表的链式存储及其操作
  9. java实现聊天室(GUI界面+私聊+群聊)
  10. AT89C2051烧写器的制做与调试
  11. 台式计算机有线无线网卡设置,笔记本/台式电脑有线网络转无线wifi教程
  12. Hard Link 与 Symbolic Link
  13. 介绍几款AI开源平台
  14. Android 开发常见问题汇总
  15. 华为机试:身高体重排序(仅有题,待求解)
  16. [转]开源大数据处理工具汇总
  17. wxc-cell使用
  18. 十三、添加RD 会话主机角色
  19. Traccar记录足迹-服务搭建及使用
  20. 萌卡纳我书飞翔公益捐书 守护阅读梦

热门文章

  1. 一图秒懂P2P、P2C 、O2O 、B2C、B2B、C2C
  2. 【java开发系列】—— 嵌套类与内部类
  3. Python爬虫实战(4):抓取淘宝MM照片
  4. Python爬虫入门(2):爬虫基础了解
  5. TLD(Tracking-Learning-Detection)学习与源码理解之(二)
  6. webpack 之 code spliting
  7. oracle 导入Excel数据
  8. VMware Workstation安装Arch Linux和xfce桌面教程
  9. Split in Java
  10. 3.5 mysql备份与恢复