python协程

Python语言基础

五迷三道 提交于 2019-11-27 05:47:31
语言特性 动态强类型语言(不少人误以为是弱类型) 动态还是静态指的是编译期还是运行期确定类型 强类型指的是不会发生隐式型转换 优缺点 胶水语言,轮子多,应用广泛 语言灵活,生产力高 性能问题,代码维护问题,Python2/3兼容问题 鸭子类型 关注点在对象的行为,而不是类型(duck typing) 比如 file,StringIO,socket 对象都支持 read/write 方法(file like object) 再比如定义了 __iter__ 魔术方法的对象可以用 for 迭代 monkey patch 所谓的 monkey patch 就是运行时替换 比如 gevent 库需要修改内置的 socket from gevent import monkey; monkey.patch_socket() 自省(Introspection) 运行时判断一个对象的类型的能力 Python 一切皆对象,用 type,id,isinstance 获取对象类型信息 Inspect 模块提供了更多获取对象信息的函数 列表或字典推导式 比如 [i for i in range(10) if i % 2 == 0] 一种快速生成 list/dict/set 的方式。用来替代 map/filter 等 (i for i in range(10) if i % 2 == 0) 返回生成器

【Python协程的实现】

吃可爱长大的小学妹 提交于 2019-11-27 02:52:18
原文: http://106.13.73.98/__/7/ 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是append,extend,pop,remove操作,就不会出现数据不安全问题协程: 永远不会出现数据不安全问题 因为协程是由程序员控制的,而程序员控制的只能是代码 协程示例代码: # 最简单的协程 a = 0 def fn1(): global a g = fn2() # 拿到生成器 next(g) # 转向fn2函数执行 a += 1 next(g) # 转向fn2函数执行 def fn2(): global a yield a += 1 yield print(fn1()) # Noneprint(a) # 2 1. 协程介绍 协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 1. Python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其它线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换

python之并发编程

拜拜、爱过 提交于 2019-11-27 02:21:12
一、操作系统与应用程序   在没有介绍线程与进程相关的知识之前,需要给大家引入一个知识点,关于操作系统与应用程序又与线程与进程有什么关系?   硬件 ...  装系统   系统就是一个有程序员写出来的软件,该软件用于控制计算机硬件,让他们之间相互配合  装软件(安装应用程序)   ...  并发与并行   并发,假,由于执行速度贴别快,感觉不到停顿   并行,真,创建10个人同时操作  线程与进程   单线程与单进程   一个软件默认一个进程,可以有多个   线程:   工作的最小单元   共享进程中的所有资源   每个线程可以分担一些任务,最终完成最后的结果   进程:   独立开辟内存   进程之间的数据隔离   注:GIL锁,是在进程中起到了阻塞线程的作用  总结:   1.操作系统帮助开发者操作硬件   2.程序员写好代码在操作系统上运行(依赖解释器)   3.任务特别多    python多线程情况下:   计算密集型操作:效率低   IO操作:效率高   python多进程情况下:   计算密集型操作:效率高(浪费资源)   IO操作:效率高(浪费资源)   以后写python时:   IO密集型用多线程   计算密集型用多进程   java多线程情况下:   计算密集型操作:效率高   IO操作:效率高   java多进程情况下:   计算密集型操作:效率高(浪费资源

【Python协程的实现】 -- 2019-08-11 18:40:16

半世苍凉 提交于 2019-11-27 00:04:35
原文: http://106.13.73.98/__/7/ 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是append,extend,pop,remove操作,就不会出现数据不安全问题协程: 永远不会出现数据不安全问题 因为协程是由程序员控制的,而程序员控制的只能是代码 协程示例代码: # 最简单的协程 a = 0 def fn1(): global a g = fn2() # 拿到生成器 next(g) # 转向fn2函数执行 a += 1 next(g) # 转向fn2函数执行 def fn2(): global a yield a += 1 yield print(fn1()) # Noneprint(a) # 2 1. 协程介绍 协程是单线程下的并发,又称微线程,纤程。英文名Coroutine。一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 1. Python的线程属于内核级别的,即由操作系统控制调度(如单线程遇到io或执行时间过长就会被迫交出cpu执行权限,切换其它线程运行) 2. 单线程内开启协程,一旦遇到io,就会从应用程序级别(而非操作系统)控制切换

Python爬虫常见问题

别说谁变了你拦得住时间么 提交于 2019-11-26 17:52:15
第一个问题:JS加密如何突破 (1) 熟练掌握Chrome的开发者工具的各个功能,Elements, Network,Source (2) 认真观察,善于思考。Network查看加载流程,找可疑的xhr请求,设置xhr断点,通过Call Stack 回溯js执行过程,边回溯边查看上下文代码。能读懂js,知道js的相关知识,比如js里面的window变量。 (3) 以上是通过debug js找到js加密解密的代码,然后通过Python重新实现,这个过程很长,可能耗费你几天的时间,一旦网站改变一下js算法你的Python实现就不能用了。 (4) 用Selenium可简单突破,并且网站随便该都无所谓。唯一遗憾的是,Selenium的运行效率较差。但是,作为一个能用js加密来保护数据的网站,单价的运行效率应该足以满足网站的访问频率限制。这时候,更多的思考是如何增加资源(IP、账号)来提高抓取效率。 第二个问题、多线程、协程,多进程的选择 (1)爬虫是IO密集型任务,大部分时间花在网络访问上,所以多进程不适合网络爬虫,而多线程、异步IO协程更适合,而异步IO是最适合的,它相比多线程,协程间的切换代价更小,我们提倡使用异步IO而非多线程。异步IO的模块主要是:aysncio, aiohttp, aiomysql 等。 (2)网页爬下来后从中提取想要的数据是CPU密集型的

Python核心技术与实战——十八|Python并发编程之Asyncio

早过忘川 提交于 2019-11-26 14:01:10
我们在上一章学习了Python并发编程的一种实现方法——多线程。今天,我们趁热打铁,看看Python并发编程的另一种实现方式——Asyncio。和前面协程的那章不太一样,这节课我们更加注重原理的理解。 通过上节课的学习,我们知道在进行I/O操作的时候,使用多线程与普通的单线程比较,效率有了很大的提高,既然这样,为什么还要Asyncio呢? 虽然多线程有诸多优点并且应用广泛,但是也存在一定的局限性: ※多线程运行过程很容易被打断,因此有可能出现race condition的情况 ※线程的切换存在一定的消耗,线程数量不能无限增加,因此,如果I/O操作非常密集,多线程很有可能满足不了高效率、高质量的需求。 针对这些问题,Asyncio应运而生。 什么是Asyncio? Sync VS Async 我们首先来区分一下Sync(同步)和Async(异步)的概念。 ※所谓Sync,是指操作一个接一个的执行,下一个操作必须等上一个操作完成后才能执行。 ※而Async是指不同操作之间可以相互交替执行,如果某个操作被block,程序并不会等待,而是会找出可执行的操作继续执行。 举个简单的例子,我们要做一个报表并用邮件发送给老板,看看两种方式有什么不同: ※按照Sync的方式,我们相软件里输入各项数据,然后等5分钟生成了报表明细以后,再写邮件发送给老板 ※而按照Async的方式,在输完数据以后

Python入门篇(八)之迭代器和生成器

邮差的信 提交于 2019-11-26 01:35:02
迭代器和生成器 1、列表生成式 列表生成式即 List Comprehensions ,是 Python 内置的非常简单却强大的可以用来创建 list 的生成式。 举个例子,要生成 list [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 可以用 list(range(1, 11)) : >>> list(range(1, 11)) [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 但如果要生成 [1x1, 2x2, 3x3, ..., 10x10] 怎么做?方法一是循环: >>> L = []` >>> for x in range(1, 11): ... L.append(x * x) ... >>> L [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 但是循环太繁琐,而列表生成式则可以用一行语句代替循环生成上面的 list : >>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 写列表生成式时,把要生成的元素 x * x 放到前面,后面跟 for 循环,就可以把 list 创建出来,十分有用,多写几次,很快就可以熟悉这种语法。 for循环 后面还可以加上 if判断 ,这样我们就可以筛选出仅偶数的平方: >>> [x * x

Python-基础-常用术语对照表

浪子不回头ぞ 提交于 2019-11-25 23:20:38
下面内容主要摘抄自 python 官网, https://docs.python.org/3.7/glossary.html#glossary ,部分内容有删减。 2to3 一个将 Python 2.x 代码转换为 Python 3.x 代码的工具,能够处理大部分通过解析源码并遍历解析树可检测到的不兼容问题。 2to3 包含在标准库中,模块名为 lib2to3;并提供一个独立入口点 Tools/scripts/2to3。参见 2to3 - 自动将 Python 2 代码转为 Python 3 代码。 因为官方将在2020年不再支持 Python 2.x, 在遇到没有 Python 2.X 版本 的code 的时候,可以尝试使用这个工具将代码转化成Python 的版本。 abstract base class -- 抽象基类 抽象基类简称 ABC,是对 duck-typing 的补充,它提供了一种定义接口的新方式,相比之下其他技巧例如 hasattr() 显得过于笨拙或有微妙错误(例如使用 魔术方法)。ABC 引入了虚拟子类,这种类并非继承自其他类,但却仍能被 isinstance() 和 issubclass() 所认可;详见 abc 模块文档。 Python 自带许多内置的 ABC 用于实现数据结构(在 collections.abc 模块中)、数字(在 numbers 模块中)