python协程

Day10 - Python协程、异步IO、redis缓存、rabbitMQ队列

丶灬走出姿态 提交于 2019-12-02 06:25:32
引子 到目前为止,我们已经学了网络并发编程的2个套路, 多进程,多线程,这哥俩的优势和劣势都非常的明显,我们一起来回顾下 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程: 协程是一种用户态的轻量级线程 。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。视作整体是原子性的核心。 方便切换控制流,简化编程模型 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。 缺点: 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上

深入理解Python中的GIL(全局解释器锁)

自作多情 提交于 2019-12-02 05:13:13
深入理解Python中的GIL(全局解释器锁) Python是门古老的语言,要想了解这门语言的多线程和多进程以及协程,以及明白什么时候应该用多线程,什么时候应该使用多进程或协程,我们不得不谈到的一个东西是Python中的GIL(全局解释器锁)。这篇我们就来看看这个GIL究竟是怎么回事。 1. GIL是什么? 首先来看看GIL究竟是什么。我们需要明确的一点是GIL并不是Python的特性,它是在实现Python解析器(CPython)时所引入的一个概念。就好比C++是一套语言(语法)标准,但是可以用不同的编译器来编译成可执行代码。有名的编译器例如GCC,INTEL C++,Visual C++等。Python也一样,同样一段代码可以通过CPython,PyPy,Psyco等不同的Python执行环境来执行。像其中的JPython就没有GIL。然而因为CPython是大部分环境下默认的Python执行环境。所以在很多人的概念里CPython就是Python,也就想当然的把GIL归结为Python语言的缺陷。所以这里要先明确一点:GIL并不是Python的特性,Python完全可以不依赖于GIL。 那么CPython实现中的GIL又是什么呢?GIL全称Global Interpreter Lock为了避免误导,我们还是来看一下官方给出的解释: In CPython, the global

Python 最常见的 170 道面试题全解析:2019 版

。_饼干妹妹 提交于 2019-12-02 04:47:36
Python 最常见的 170 道面试题全解析:2019 版 引言 最近在刷面试题,所以需要看大量的 Python 相关的面试题,从大量的题目中总结了很多的知识,同时也对一些题目进行拓展了,但是在看了网上的大部分面试题不是很满意,一个是有些部分还是 Python2 的代码,另一个就是回答的很简单,有些关键的题目,也没有点出为什么,最重要的是还有一些复制粘贴根本就跑不通,这种相信大家深有体会吧,这样就导致我们可能需要去找其他人发的类似的教程。难受啊,所以我决定针对市面上大多的 Python 题目做一个分析,同时也希望大家尽可能的做到举一反三,而不是局限于题目本身。大概就这样吧,有你看过的题目也有你没看到过的。 通过本场 Chat,你将获得如下知识点: 掌握 Python 的基础语法 语法常见的 Python 应用场景 掌握 Python 闭包的使用以及装饰器的使用 生成器和迭代器的使用 常见的设计模式的使用 深浅拷贝的区别 线程、进程、协程的使用 了解 Python 中的元编程和反射 常考的数据结构和算法 爬虫相关知识,网络编程基本知识等 所有题目 语言特性 1.谈谈对 Python 和其他语言的区别 2.简述解释型和编译型编程语言 3.Python 的解释器种类以及相关特点? 4.说说你知道的Python3 和 Python2 之间的区别? 5.Python3 和 Python2

python使用gevent实现协程

余生长醉 提交于 2019-12-02 02:41:44
gevent是一个基于协程的python网络库,在遇到IO阻塞时,程序会自动进行切换,可以让我们用同步的方式写异步IO代码。 # coding:utf8 import requests import gevent from gevent import monkey monkey.patch_all() # 用于将标准库中大部分阻塞式调用修改为协作式运行 def fetch(url): print("get: {}".format(url)) response = requests.get(url).content print("{}: {}".format(url, len(response))) if __name__ == "__main__": gevent.joinall([ gevent.spawn(fetch, "https://stackoverflow.com/"), gevent.spawn(fetch, "https://www.douban.com"), gevent.spawn(fetch, "https://www.github.com") ]) 结果为: >>> get: https://stackoverflow.com/ >>> get: https://www.douban.com >>> get: https://www.github.com >

python面试题整理(二)

旧时模样 提交于 2019-12-01 22:42:42
1、进程,线程,协程定义,有什么区别    进程是操作系统分配资源的最小单位,一个进程对应一块CPU   线程是进程中的某一个控制单元,是CPU调度的最小单元,线程之间相互独立,进程结束线程也会结束,一个进程至少要有一个线程   协程是更加轻量级的存在,不是由CPU进程管理而是由程序员管理,在执行一个函数过程中可以中断执行另一个函数,执行一个函数过程就叫协程,python3以前使用 yield 表示协程,yield关键字一般用于做生成器,实现在函数中暂停的效果,python3.3以后出现 yield from 后面跟可迭代对象,3.5以后使用 async和await 实现原生协程。     区别:     (1) 线程之间切换是由操作系统决定的 ,切换速度特别快,但是切换频率太高, 协程之间切换由程序决定 ,不会像线程切换那么耗费资源,在高并发下执行效率更高,   性能更优     (2)协程中控制共享资源不加锁     (3)协程使用同步的方式实现异步,在单进程里实现任务切换 2、子进程是什么    在一个进程中创建开启另一个进程,这个进程称为子进程,即在父进程中创建的进行 3、僵尸进程知道吗    父进程还在执行,子进程执行完毕后不会立即退出,操作系统会清理内存空间,但是保留进程号(pid),等待父进程清理资源,这个时候子进程成为僵尸进程 4、线程和协程有什么区别     

腾讯测试开发面试总结

谁说胖子不能爱 提交于 2019-12-01 18:13:32
昨天接到了秋招以来的第一场面试,面试了腾讯的测试开发岗,自己感觉不是特别好,写此片博客只为总结下此次面试。 以前自己总觉得自己还不错,秋招应该可以找到一份工作,但此次面试对我犹如当头一棒!人不可骄傲,学习是一件终身去完成的事,不要以为自己学会了,就可以做自己可以做的事。记得有个故事:两个人在森林中遇到了一只老虎,那么老虎先吃谁呢?当然是吃跑的慢的。老虎就像这个社会的淘汰法则,你只要比别人慢,或者用程序员的来讲,你的技术只要比别人菜,你就有可能被吃。搞技术开发的,当问题来临时,解决不了,没有什么理由,菜就是原罪。 一、当下都有哪些爬虫技术、与反爬虫手段? 爬虫技术: 1、python自带的urlib2和urlib或者第三方模块request 此种方案适合简单的页面爬虫,比如爬取博客的文章等等,相对于其他的一些高级爬虫来讲,它没有异常处理与请求速度控制等,需要我们取用额外的代码去控制。 2、scrapy框架  相比urlib等基础爬虫,请求调度、异常处理都已经进行了基础的封装、而且有第三方的csrapy-redis模块支持分布式、使得程序员将重点放在了页面分析与规则编写上面。 3、python selenium和PhantomJS 具有很好的反爬虫技术、可以通过技术手段去模拟出和人非常类似的操作行为,缺点就是速度比较慢、但是爬虫一帮来讲对于速度的要请求不是很高、更注重的是数据的稳定

“ yield”关键字有什么作用?

﹥>﹥吖頭↗ 提交于 2019-12-01 17:31:26
Python中 yield 关键字的用途是什么? 它有什么作用? 例如,我试图理解这段代码 1 : def _get_child_candidates(self, distance, min_dist, max_dist): if self._leftchild and distance - max_dist < self._median: yield self._leftchild if self._rightchild and distance + max_dist >= self._median: yield self._rightchild 这是呼叫者: result, candidates = [], [self] while candidates: node = candidates.pop() distance = node._get_dist(obj) if distance <= max_dist and distance >= min_dist: result.extend(node._values) candidates.extend(node._get_child_candidates(distance, min_dist, max_dist)) return result 调用 _get_child_candidates 方法时会发生什么? 是否返回列表?

python生成器

删除回忆录丶 提交于 2019-12-01 17:26:38
生成器(generator) 指代的是生成器对象,它可以由生成器表达式得到,也可以使用 yield关键字 得到一个生成器函数,调用这个生成器函数就可以得到一个生成器对象。另外,通过数据的转换也可以获取生成器。 生成器对象是一个 可迭代对象 ,它是一个 迭代器 。生成器的作用是 延迟计算,惰性求值。 生成器表达式产生生成器对象 #生成器表达式产生生成器 a =(x**2 for x in range(5)) print(type(a)) print(next(a)) print(next(a)) print(next(a)) print(next(a)) 结果为: <class 'generator'> 0 1 4 9 生成器函数 生成器函数也就是函数体中包含 yield关键字的函数 ,这个函数会返回一个生成器对象! def inc(): for i in range(5): yield i print(type(inc)) print(type(inc())) x=inc() print(type(x)) print(next(x)) for m in x: print(m,"**") for i in x:#因为x为生成器对象,所以它只能被遍历一次。再次遍历不会被执行了。 print(i,"*") 结果为: <class 'function'> <class 'generator

“ yield”关键字有什么作用?

早过忘川 提交于 2019-12-01 17:20:48
Python中 yield 关键字的用途是什么? 它有什么作用? 例如,我试图理解这段代码 1 : def _get_child_candidates(self, distance, min_dist, max_dist): if self._leftchild and distance - max_dist < self._median: yield self._leftchild if self._rightchild and distance + max_dist >= self._median: yield self._rightchild 这是呼叫者: result, candidates = [], [self] while candidates: node = candidates.pop() distance = node._get_dist(obj) if distance <= max_dist and distance >= min_dist: result.extend(node._values) candidates.extend(node._get_child_candidates(distance, min_dist, max_dist)) return result 调用 _get_child_candidates 方法时会发生什么? 是否返回列表?

Python开发之路

爷,独闯天下 提交于 2019-12-01 13:59:31
第一部分 MarkDown 基本语法 001 Markdown 基本语法 第二部分 Python集成环境和解释器 002 Python解释器 003 Python解释器源修改 004 pip的使用 005 Python的IDE之Pycharm的使用 006 Python的IDE之Jupyter的使用 第三部分 计算机基础 007 计算机的基础编程 008 计算机组成.md 009 计算机操作系统 010 编程语言的分类 第四部分 Python基础 011 执行Python程序的两种方式 012 变量 013 常量 014 Python变量的内存管理 015 变量的三个特征 016 花式赋值 017 注释 018 数据的类型 019 解压缩,用户交互 020 格式化输出的三种方式 021 基础运算符 022 程序流程控制if判断 023 程序流程控制while判断 024 程序流程控制for循环 025 数字类型内置方法.md 026 字符串类型内置方法 027 列表类型内置方法 028 元组的内置方法 029 字典的内置方法 030 集合的内置方法 031 数据类型分类 032 深浅拷贝 033 异常处理 第五部分 文件处理 034 基本的文件处理 035 绝对路劲和相对路径 036 字符编码 037 Python2和Python3字符编码的区别 038 文件的三种打开方式 039