Python 协程,Python携程

协程

进程:操作系统中存在

线程:操作系统中存在

协程:是微线程 模块(greenlet)

协程不是一个真实存在的东西,是由程序员创造出来的

协程,是对一个线程分片,使得线程在代码块之间进行来回切换,而不是原来逐步执行。

单纯的协程是无用的,有时候而且会降低性能

示例代码:

import greenlet

def f1():

print(11)

gr2.switch()

print(22)

gr2.switch()

def f2():

print(33)

gr1.switch()

print(44)

# 创建两个协程

gr1 = greenlet.greenlet(f1)

gr2 = greenlet.greenlet(f2)

gr1.switch()

协程存在的意义

单线程实现并发:如果遇到IO操作就会进行切换

遇到IO就切换 + 协程 == 牛逼起来了。。。

遇到IO就切换 实现:gevent模块

gevent模块(IO切换+协程)

安装:

pip install gevent

示例代码:

########### 协程+IO切换

from gevent import monkey

monkey.patch_all() # 以后代码中遇到IO就会执行greenlet的switch进行切换

import requests

import gevent

def get_page(url):

resp = requests.get(url)

print(url,resp.content.decode('utf8'))

gevent.joinall([

gevent.spawn(get_page,'https://www.python.org/'), # 协程1

gevent.spawn(get_page,'https://www.yahoo.com/'), # 协程2

gevent.spawn(get_page,'https://github.com/'), # 协程3

])

什么是协程?

协程也可以称为”微线程“,就是开发者控制着线程执行流程,控制先执行某段代码然后再切换到另外函数执行代码.... 来回切换

协程可以提高并发吗?

协程本身无法实现并发(甚至性能会降低)

协程+IO切换性能会提高

进程;线程;协程的区别?

1.进程是计算器最小资源分配单位

2.线程是CPU调度的最小单位

3.进程切换需要的资源很最大,效率很低

4.线程切换需要的资源一般,效率一般(当然了在不考虑GIL的情况下)

5.协程切换任务资源很小,效率高(协程本身并不存在,是程序员通过控制IO操作完成)

6.多进程、多线程根据cpu核数不一样可能是并行的,但是协程是在一个线程中 所以是并发

进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所以进程间数据不共享,开销大。

线程: 调度执行的最小单位,也叫执行路径,不能独立存在,依赖进程存在一个进程至少有一个线程,叫主线程,而多个线程共享内存(数据共享,共享全局变量),从而极大地提高了程序的运行效率。

协程:是一种用户态的轻量级线程,协程的调度完全由用户控制。协程拥有自己的寄存器上下文和栈。 协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

区别与联系

多进程的优点是稳定性好,一个子进程崩溃了,不会影响主进程以及其余进程。但是缺点是创建进程的代价非常大,因为操作系统要给每个进程分配固定的资源,并且,操作系统对进程的总数会有一定的限制,若进程过多,操作系统调度都会存在问题,会造成假死状态。

多线程优点是效率较高一些,但是致命的缺点是任何一个线程崩溃都可能造成整个进程的崩溃,因为它们共享了进程的内存资源池。 对于任务数来说,无论是多进程或者多线程,都不能太多。因为操作系统在切换任务时,会有一系列的保护现场措施,这要花费相当的系统资源,若任务过多,则大部分资源都被用做干这些了,结果就是所有任务都做不好,所以操作系统会限制进程的数量。 另外,考虑计算密集型及IO密集型应用程序。对于计算密集型,多任务势必造成资源浪费。对于IO密集型,因为IO速度远低于CPU计算速度,所以使用多任务方式可以大大增大程序运行效率。

协程是python个中另外一种实现多任务的方式,只不过比线程更小占用更小执行单元(理解为需要的资源)。 为啥说它是一个执行单元,因为它自带CPU上下文。这样只要在合适的时机, 我们可以把一个协程 切换到另一个协程。 只要这个过程中保存或恢复 CPU上下文那么程序还是可以运行的。

在实现多任务时, 线程切换从系统层面远不止保存和恢复 CPU上下文这么简单。 操作系统为了程序运行的高效性每个线程都有自己缓存Cache等等数据,操作系统还会帮你做这些数据的恢复操作。 所以线程的切换非常耗性能。但是协程的切换只是单纯的操作CPU的上下文,所以一秒钟切换个上百万次系统都抗的住。

单线程提供并发

协程+IO切换:gevent

基于事件循环的异步非阻塞框架:Twisted

基于yield实现协程(了解即可)

def f1():

print(1)

yield

print(2)

yield

print(3)

def f2():

print(4)

yield

print(5)

yield

print(6)

v1 =f1()

v2 =f2()

next(v1)

next(v2)

next(v1)

next(v2)

next(v1)

next(v2)

总结

python多线程调用携程,Python 协程,Python携程相关推荐

  1. cv2 python 多线程调用摄像头_2种方法用python调用cv2模块给图片打马赛克

    1 说明: ===== 1.1 因各种需要,给图片打马赛克,当然本人着重介绍python用cv2的方法,主要讲解python和cv2的相关编程知识. 1.2 cv2模块:是OpenCV的python调 ...

  2. python多线程调用携程,进程、线程和携程的通俗解释【刘新宇Python】

    通过下面这张图你就能看清楚了,进程.线程和携程的关系 多个进程是可以运行在多个CPU当中的,比如你的电脑是4核,可以同时并行运行四个进程,这是真正物理上的并行运行. 每个进程又可以有多个线程,线程是轮 ...

  3. python 无法调用turtle_新人求助,关于python 调用turtle《python简单turtle教程》

    新人求助,关于python 调用turtle 什么呀 turtle是python的简单的绘块,以下是一个例子from turtle import * def yin(radius, color1, c ...

  4. python多线程调用视频流进行模型处理后播放

    代码如下 fire.py import time import multiprocessing as mp import threading import cv2 from PIL import Im ...

  5. python模块调用的用法_如何使用Python语言中的random模块调用方法

    Python语言中的random模块,包含了很多方法属性,可以直接调用这些方法和设置属性.根据不同的方法展示不同的内容.下面利用几个实例查看random模块中的方法,操作如下: 工具/原料 Pytho ...

  6. python多线程并发编程技术_同步线程 - Python并发编程教程™

    线程同步可以定义为一种方法,借助这种方法,可以确信两个或更多的并发线程不会同时访问被称为临界区的程序段. 另一方面,正如我们所知道的那样,临界区是共享资源被访问的程序的一部分. 因此,同步是通过同时访 ...

  7. python 类调用不存在的方法_[python] 类常用的内置方法

    内置方法 说明 __init__(self,...) 初始化对象,在创建新对象时调用 __del__(self) 释放对象,在对象被删除之前调用 __new__(cls,*args,**kwd) 实例 ...

  8. python中调用是什么意思_在Python中调用函数的含义?

    因为Dense(-)返回一个可调用的(基本上是一个函数),所以可以依次调用它.这是一个简单的例子: def make_adder(a): def the_adder(b): return a + b ...

  9. python能调用身份证读卡器吗_用Python在Linux下调用新中新DKQ-A16D读卡器,读二代证数据...

    1.背景 最近在研究二代证读卡器,手头上的设备是新中新DKQ-A16D,在官网(https://www.onecardok.com.cn/download)逛了一圈,发现Win下的示例,浏览器插件很多 ...

最新文章

  1. 【SVN】svn“E155017工作副本的参考文件损坏、E200014文件校验和不匹配”的解决方法
  2. javac环境变量配置(转)
  3. 基于MATLAB的OSPF协议网络仿真
  4. SQL Tips:兼顾检索速度和精确性
  5. 数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
  6. table ADR6 引起的equipment download error
  7. python 将两幅图拼接_清华王教授典藏的python电子书,整整10个G拿去不谢
  8. 6 获取当前模块_python常用模块的常用方法介绍
  9. python 多环境安装
  10. 如何避免学习linux必然会遇到的几个问题
  11. Web 前端编程运维必备
  12. 系统找不到指定的文件。 : No installed service named Apache
  13. 主生产计划 操作教程 用友u8_【用友u8操作教程(用友财务软件u8实际操作教程)】免费在线试用_软件库_选软件网...
  14. 策略模式:网络小说的固定套路
  15. 大学生计算机应用基础赵山林高媛,我院学生获“第四届全国大学生计算机应用能力与信息素养大赛(IC3)”全国一等奖...
  16. 华为大佬:做一个快乐的程序员
  17. 前端网络基础-应用层DNS协议
  18. 如何用div+css布局页面
  19. (转)安装SQL Server:以前某个程序安装时挂起了文件操作,安装程序前请重启
  20. 生活哲理故事系列之六(转贴)

热门文章

  1. 基于SSM在线考试系统的核心功能之一自动组卷的实现 SpringBoot版本
  2. 异物入侵自动报警系统-matlab
  3. ecshop 首页如何调用积分商城里面的的商品
  4. Python实现微信读书辅助工具
  5. Redis命令详解:Sets
  6. 玩转Redis集群之Sentinel
  7. dw网页分栏html,DW网页布局(表格、布局表格).ppt
  8. R语言绘图 | 折线图画法,如何画出你满意的图?
  9. CISP-PTE学习笔记综合考试题复现WP
  10. 大学学计算机专业好吗,就读清华大学计算机专业好处竟然这么多?