gevent 入门篇

2024-08-27 21:52
文章标签 入门篇 gevent

本文主要是介绍gevent 入门篇,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

gevent 入门篇

并发编程模型主要有: 多进程,多线程,事件驱动, 协程. gevent 是基于协程的异步框架,它需要依赖于greenlet.gevent有什么样的优势? 先来通过一个简单的例子对比同步执行一个方法和使用gevent的异步方式.

普通的单线程同步执行任务

import timedef sync_task():#do somethingtime.sleep(1)def sync_run():start = time.time()for i in range(10):sync_task()end = time.time()print("sync task executed in %f second"%(end-start))

打印结果: async task executed in 10.012671 second

如果换成多线程会是什么情况呢?

import threadingdef multi_thread_run():start = time.time()for i in range(10):t = threading.Thread(target=sync_task)t.start()end = time.time()print("multi thread task executed in %f second"%(end-start))

打印结果是:multi thread task executed in 0.002425 second, 呵呵,这个时间简直亮瞎了, 其实这段程序有问题,子线程还没执行完时,主线程就结束了,因此时间才那么短,其实要稍稍修改:

def multi_thread_run():start = time.time()threads = []for i in range(300):t = threading.Thread(target=sync_task)threads.append(t)t.start()for t in threads:t.join()end = time.time()print("multi thread task executed in %f second"%(end-start))

等所有子线程执行完之后再执行主线程,看看打印结果:

multi thread task executed in 1.002796 second

这是一个比较正常的结果.

换成gevent后会怎样呢?

import gevent
def async_task():#do somethinggevent.sleep(1)def async_run():start = time.time()coroutins = []for i in range(10):coroutins.append(gevent.spawn(async_task))gevent.joinall(coroutins)end = time.time()print("async task executed in %f second"%(end-start))

打印输出:async task executed in 1.002012 second
gevent.spawn()方法会创建一个协程实例,gevent.joinall()是使所有的线程执行完了之后在运行主线程,这跟多线程编程是同样的概念. 发现gevent比多线程也没快多少,那gevent究竟有什么优势.现在假设把上面的10替换成1000,也就是1000线程与1000个coroutine之间的比较,会出现什么结果呢?如果是用线程的话直接报错了:thread.error: can't start new thread.而用协程就不会出现这种问题.

coroutine相比thread的优势在于:

  • 创建threade的成本高,而创建coroutine的成本很低
  • thread的上下文切换成本高,而coroutin的切换速度很快
  • thread的上下文切换取决于cpu,而coroutine由自己控制

先介绍到这里,下次接着聊

参考淺談coroutine與gevent

这篇关于gevent 入门篇的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1112882

相关文章

Spring Boot 入门篇

一、简介 Spring Boot是一款开源的Java Web应用框架,旨在简化Spring应用的初始搭建以及开发过程。它整合了Spring技术栈中的诸多关键组件,为开发者提供了一种快速、简便的Spring应用开发方式。Spring Boot遵循“约定优于配置”的原则,通过自动配置、起步依赖和内置的Servlet容器,极大地简化了传统Spring应用的配置和部署过程。 二、Spring Boot

(入门篇)JavaScript 网页设计案例浅析-简单的交互式图片轮播

网页设计已经成为了每个前端开发者的必备技能,而 JavaScript 作为前端三大基础之一,更是为网页赋予了互动性和动态效果。本篇文章将通过一个简单的 JavaScript 案例,带你了解网页设计中的一些常见技巧和技术原理。今天就说一说一个常见的图片轮播效果。相信大家在各类电商网站、个人博客或者展示页面中,都看到过这种轮播图。它的核心功能是展示多张图片,并且用户可以通过点击按钮,左右切换图片。

第49课 Scratch入门篇:骇客任务背景特效

骇客任务背景特效 故事背景:   骇客帝国特色背景在黑色中慢慢滚动着! 程序原理:  1 、 角色的设计技巧  2 、克隆体的应用及特效的使用 开始编程   1、使用 黑色的背景: ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/7d74c872f06b4d9fbc88aecee634b074.png#pic_center)   2

【轻松上手postman】入门篇:如果根据接口文档写postman接口用例

在我们平时的测试工作中除了最基本的网页测试外,也会遇到没有页面但需要验证内部逻辑正确性的接口测试任务,在遇到没有网页的测试任务时,我们就要使用到接口测试工具来模拟对程序代码触发。 在接到接口测试任务时,一般都会拿到接口需求文档,没接触过接口测试的人看到接口文档正常反应一脸闷🤣不知如何下手怎么开始测试😓,下面我就来讲讲如何将接口文档上的一个个接口转换成postman用例 首先需要安装

入门篇:神奇的Annotation

涅槃1992 关注 2016.12.25 23:41* 字数 4964 阅读 1059评论 3喜欢 29 前面写了Android 开发:由模块化到组件化(一),很多小伙伴来问怎么没有Demo啊?之所以没有立刻放demo的原因在还有许多技术点没说完. 今天我们就来细细评味Java当中Annotation,也就是我们常说的注解. 本文按照以下顺序进行:元数据->元注解->运行时注解->编译时

springboot+dubbo+zk 入门篇(windows单机版)

一、下载安装zk注册中心并启动:     官网地址:http://www.apache.org/dyn/closer.cgi/zookeeper/     我的是zookeeper-3.3.6版本的。下载之后需要修改下文件:进入zk的conf目录。复制下zoo_sample.cfg     这个文件并重命名为zoo.cfg,然后把修改该文件内容,下面是我的,这个只是单机配置: # 心跳时间间隔

Pawlak粗糙集模型入门篇

文件目录 Pawlak粗糙集模型前置知识 I N D ( B ) IND(B) IND(B):属性集 B B B的不可区分关系对于 ∀ x ∈ U \forall x\in U ∀x∈U相对于 B B B的等价类定义为 U / I N D ( B ) U/IND(B) U/IND(B): I N D ( B ) IND(B) IND(B)的所有等价类集合划分 粗糙集粗糙集的基本概念图例题练习

防火墙基本原理入门篇,小白一看就懂!

吉祥知识星球http://mp.weixin.qq.com/s?__biz=MzkwNjY1Mzc0Nw==&mid=2247485367&idx=1&sn=837891059c360ad60db7e9ac980a3321&chksm=c0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330&scene

Redis基础知识学习(入门篇)

文章目录 五大数据结构一. String: 字符串二. Hash: 散列概念性质 三. List: 列表四. Set: 集合特点 五. Sorted Set: 有序集合 五大数据结构 一. String: 字符串 数据结构中,字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。 严格意义上讲,串存储结构也是一种线性存储结构,因为字符串中的字符之间也具有

《嵌入式-STM32开发指南》第一部分 入门篇 - 第6章 STM32下载程序及调试

6.1 STM32的启动模式 STM32三种启动模式对应的存储介质均是芯片内置的,它们是: 1)用户闪存 = 芯片内置的Flash。 2)SRAM = 芯片内置的RAM区,就是内存啦。 3)系统存储器 = 芯片内部一块特定的区域,芯片出厂时在这个区域预置了一段Bootloader,就是通常说的ISP程序。这个区域的内容在芯片出厂后没有人能够修改或擦除,即它是一个ROM(只读)区。 在每个ST