python协程–asyncio模块(基础并发测试)

在高并发的场景下,python提供了一个多线程的模块threading,但似乎这个模块并不近人如意,原因在于cpython本身的全局解析锁(GIL)问题,在一段时间片内实际上的执行是单线程的。同时还存在着资源争夺的问题。python3.4之后引入了基于生成器对象的协程概念。也就是asyncio模块。除了asyncio模块,python在高并发这一问题还提出了另外一些解决方案,例如tornado和gevent都实现了类似的功能。由此,在方案选择上提供了更多的可能性。以下是threading模块和asyncio模块对比测试实验。asyncio模块的具体使用,我希望自己在另一篇文章再写。

一、threading模块

threading模块中的thread线程 密集 运算争夺变量测试

代码:

由结果可以看出,多线程在密集型运算的(占用大量CPU运算单元)情况下,会出现前后同一变量的数据不一致的情况。也就是所谓的”竞态问题”。

二、asyncio模块

asyncio模块 密集运算测试(线程安全!不存在争夺资源问题),所以协程在密集运算和IO并发上都有很强的支持。

代码:

代码实现思路:

(1)思路1:每一个协程的睡眠时间相同,也就是说几乎是同时在运行密集型计算,并用num自增计算作为协程的代号。

(2)思路2:为了区别开不同协程的占据CPU的运行时间片,我对睡眠时间进行了一个乘法运算,协程代号越大的协程睡眠时间越长,并用时间作为协程代号的记录。

(3)思路3:这次我将睡眠时间作一个调整,用除法运算,也就是说,协程代号越大的,睡眠时间越短,不过这次协程代号用num来记录,并且放在了睡眠(阻塞)之前。

摘取前几个数据

由上面两组数据可以看出,无论协程是同时进行还是分时间段进行,都是严格按照顺序来执行的。思路2的结果很符合我们的认知常识,那么思路1的结果是怎么得来的呢?原因在于,多并发(此处的密集型运算用于模拟一系列的并发内部操作)情况下,阻塞的协程会暂时被搁置,切换到另外的协程。可以将协程的运行理解为一个队列,当大量协程来临的时候,无法一次性执行,于是放进一个类似队列的容器(WeakSet),并且不断检测这个队列中哪一个协程是处于非阻塞状态的,去调用这个协程的资源并运行。队列中的每一个元素间是互不干扰的。于是,就出现了以上的结果—-有序的协程运行。

为什么所有的协程号都一样

因为最大协程号,睡眠时间最短,所以它先执行输出,而协程号是累加的,所以后面执行的线程都会以最大的协程号作为标记。由此进一步看出

三、性能对比

完成时间对比:

threading:平均运行时间:7.0秒

anyncio:平均运行时间3.08秒

由上面的多线程模块threading和协程模块asyncio的对比可以看出,ansyncio的完成时间是threading的一半左右。由此,asyncio在高并发的情况下具有比较大的优势,并且在资源的保护上也做得比threading要好。

Original: https://www.cnblogs.com/thomson-fred/p/10142226.html
Author: 2015夏
Title: python协程–asyncio模块(基础并发测试)

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/609926/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java广度优先爬虫示例(抓取复旦新闻信息)

    以下内容仅供学习交流使用,请勿做他用,否则后果自负。 一.使用的技术 这个爬虫是近半个月前学习爬虫技术的一个小例子,比较简单,怕时间久了会忘,这里简单总结一下.主要用到的外部Jar…

    Java 2023年5月29日
    073
  • 接口

    基本介绍:接口就是给出一些没有实现的方法,封装到以一起,到某个类要使用的时候再根据具体情况把 这些方法写出来。 语法: interface 接口名 { //属性 //方法(1.抽象…

    Java 2023年6月5日
    081
  • 使用RabbitMQ实现延迟任务

    本文转自:https://www.cnblogs.com/haoxinyue/p/6613706.html 场景一:物联网系统经常会遇到向终端下发命令,如果命令一段时间没有应答,就…

    Java 2023年5月30日
    088
  • 【笔试】1、强迫卖家

    小明是个强迫症卖家,有10000台设备,卖的均价要求最接近D元,输出卖出的台数N,总售价M 输入 0首先想得是暴力解答然后是二分查找,寻找卖出多少台才符合要求,但是一直找不到符合要…

    Java 2023年6月5日
    081
  • 那些年,我们见过的 Java 服务端乱象

    导读 查尔斯·狄更斯在《双城记》中写道:”这是一个最好的时代,也是一个最坏的时代。” 移动互联网的快速发展,出现了许多新机遇,很多创业者伺机而动;随着行业竞…

    Java 2023年5月29日
    0153
  • Spring Boot+Mybatis 配置多数据源

    目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑。在 SpringBoot中也可以实现多数据源并配合 Mybat…

    Java 2023年5月30日
    085
  • activemq安装与简单消息发送接收实例

    安装环境:Activemq5.11.1, jdk1.7(activemq5.11.1版本需要jdk升级到1.7),虚拟机: 192.168.147.131 配置Nginx代理Act…

    Java 2023年5月29日
    079
  • 十六、多线程(基础)(完结)

    十六、多线程(基础) 16.1 线程相关概念 16.1.1 程序 是为完成特定任务、用某种语言编写的一组指令的集合。 简单的说:就是我们写的代码 16.1.2 进程 进程是指运行中…

    Java 2023年6月5日
    0135
  • java list 按照多字段排序

    list 排序涉及的接口 Comparator, 具体实现代码如下,以Apple类为例 public class Test{  public static void main(St…

    Java 2023年5月29日
    072
  • spring-boot-导出excel-xlsx 文件损坏

    maven的pom文件处理 ①将resource标签配置如下 src/main/resources true bootstrap.yml **/*.xml **/excelTemp…

    Java 2023年6月9日
    059
  • 接口

    JDK1.8之前 package com.gao.test.Test7; /* 1.类是类,接口是接口,他们是同一层次的概念。 2.接口中没有构造器 3.接口如何声明:interf…

    Java 2023年6月5日
    094
  • 利用Github Action实现Tornadofx/JavaFx打包

    原文地址: 利用Github Action实现Tornadofx/JavaFx打包 – Stars-One的杂货小窝 最近开了个新项目stars-one/xtool: …

    Java 2023年6月14日
    092
  • Java8新特性-Stream API

    Java8中有两大最为重要的改变。第一个是 Lambda 表达式;另外一 个则是 Stream API(java.util.stream.*)。 Stream 是 Java8 中处…

    Java 2023年6月8日
    075
  • 线程通信

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月7日
    073
  • MySQL三大日志、 MVCC、锁、分库分表、主从复制、优化

    MySQL三大日志(binlog、redolog、undolog) 1、redo log(重做日志)物理日志 (1)InnoDB存储引擎独有的,使MySQL崩溃后能恢复数据,保证数…

    Java 2023年6月5日
    062
  • 微服务框架核心源码深度解析<<大厂学院完结>>

    Sentinel核心源码解析 Sentinel是分布式系统的防御系统。以流量为切入点,通过动态设置的流量控制、服务熔断等手段达到 保护系统的目的,通过服务降级增强服务被拒后用户的体…

    Java 2023年6月7日
    077
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球