python协程

python-多任务之协程

痴心易碎 提交于 2020-02-03 00:51:00
迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 # 例如 for value in [ 2 , 3 , 4 ] : print ( value ) 可迭代对象 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串 如何判断是否为可迭代对象 # 元组,列表,字典,字符串,集合,range都是可迭代对象 from collections . abc import Iterable # 3.7以上版本为导入collections.abc # from collections import Iterable # 判断对象是否是指定类型 result = isinstance ( ( 3 , 5 ) , Iterable ) print ( "元组是否是可迭代对象:" , result ) result = isinstance ( [ 3 , 5 ] , Iterable ) print ( "列表是否是可迭代对象:" , result ) result = isinstance ( { "name" : "张三" } , Iterable ) print ( "字典是否是可迭代对象:" , result ) result = isinstance ( "hello" , Iterable ) print

python学习笔记——异步IO

南楼画角 提交于 2020-01-31 17:36:12
异步IO 对于异步IO阻塞非阻塞,我觉得下面的例子更简单易懂。 老张爱喝茶,废话不说,煮开水。 出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。 1 老张把水壶放到火上,立等水开。(同步阻塞) 老张觉得自己有点傻 2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞) 老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。 3 老张把响水壶放到火上,立等水开。(异步阻塞) 老张觉得这样傻等意义不大 4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞) 老张觉得自己聪明了。 所谓同步异步,只是对于水壶而言。 普通水壶,同步;响水壶,异步。 虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。 同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。 所谓阻塞非阻塞,仅仅对于老张而言。 立等的老张,阻塞;看电视的老张,非阻塞。 情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。 生成器进阶 关于yield和yield from def generator_1(titles): yield titles def

django高级之爬虫基础

会有一股神秘感。 提交于 2020-01-30 06:23:51
目录: 爬虫原理 requests模块 beautifulsoup模块 爬虫自动登陆示例 一、爬虫原理 Python非常适合用来开发网页爬虫,理由如下: 1、抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁;相比其他动态脚本语言,如perl,shell,python的urllib包提供了较为完整的访问网页文档的API。(当然ruby也是很好的选择) 此外,抓取网页有时候需要模拟浏览器的行为,很多网站对于生硬的爬虫抓取都是封杀的。这是我们需要模拟user agent的行为构造合适的请求,譬如模拟用户登陆、模拟session/cookie的存储和设置。在python里都有非常优秀的第三方包帮你搞定,如Requests,mechanize 2、网页抓取后的处理 抓取的网页通常需要处理,比如过滤html标签,提取文本等。python的beautifulsoap提供了简洁的文档处理功能,能用极短的代码完成大部分文档的处理。 其实以上功能很多语言和工具都能做,但是用python能够干得最快,最干净。 3、爬虫架构 URL管理器:管理待爬取的url集合和已爬取的url集合,传送待爬取的url给网页下载器。 网页下载器(urllib、requests):爬取url对应的网页,存储成字符串或文件,传送给网页解析器。 网页解析器

最新Python异步编程详解

久未见 提交于 2020-01-29 09:00:20
我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的呢? 简单的回答是Python通过协程(coroutine)来实现异步编程。那究竟啥是协程呢?这将是一个很长的故事。 故事要从yield开始说起(已经熟悉yield的读者可以跳过这一节)。 yield yield是用来生成一个生成器的(Generator), 生成器又是什么呢?这又是一个长长的story,所以这次我建议您移步到这里: 完全理解Python迭代对象、迭代器、生成器 ,而关于yield是怎么回事,建议看这里: [翻译]PYTHON中YIELD的解释 好了,现在假设你已经明白了yield和generator的概念了,请原谅我这种不负责任的说法但是这真的是一个很长的story啊! 总的来说,yield相当于return,它将相应的值返回给调用next()或者send()的调用者,从而交出了cpu使用权,而当调用者再调用next()或者send()时,又会返回到yield中断的地方,如果send有参数,又会将参数返回给yield赋值的变量,如果没有就跟next()一样赋值为None。但是这里会遇到一个问题,就是嵌套使用generator时外层的generator需要写大量代码

python之greenlet实现协程

不羁岁月 提交于 2020-01-29 03:49:57
greenlet+switch机制来实现协程 greenlet用于创建协程,switch用于进行协程之间的切换某个协程在执行的过程中可以随时的被其他协程通过switch函数来打断,转而去执行其他协程,当前协程的中断现场会被保留,一旦中断的协程再次获得cpu的执行权首先会恢复现场然后从中断处继续执行 这种机制下的协程是同步,不能并发: from greenlet import greenlet from time import sleep def func1 ( ) : print ( "协程1" ) sleep ( 2 ) g2 . switch ( ) print ( "协程1恢复运行" ) def func2 ( ) : print ( "协程2" ) sleep ( 1 ) g3 . switch ( ) def func3 ( ) : print ( "协程3" ) sleep ( 1 ) g1 . switch ( ) if __name__ == '__main__' : # 使用greenlet来创建三个协程 g1 = greenlet ( func1 ) g2 = greenlet ( func2 ) g3 = greenlet ( func3 ) # print(g1) g1 . switch ( ) # 让协程g1取抢占cpu资源 ''' 协程1 协程2 协程3

Python进程、线程、协程之间的关系

喜你入骨 提交于 2020-01-28 15:22:27
一、从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 。 1.进程: 表示一个程序的执行活动 (打开程序、读写程序数据、关闭程序) 2.线程: 执行某个程序时, 该进程调度的最小执行单位 (执行功能1,执行功能2) 一个程序至少有一个进程 一个进程至少有一个线程 1.并行: 需要处理的任务数 == CPU核心数量 两个任务 两个核心 任务1:------------- 任务2:------------- 2.并发: 需要处理的任务数 > CPU核心数量 三个任务 一个核心 任务1: ----- ------ 任务2: ------ 任务3: ------ 二、从程序角度 多进程和多线程 表示:当前程序可以同时执行多个任务 进程和线程都是由 操作系统调度完成 1.进程:    每个进程都是有自己独立的内存空间,不同进程之间的内存空间是不能共享。 不同进程之间的通信是由操作系统来完成的。 不同进程之间的通信效率低切换开销也大。 2.线程:   一个进程下可以有多个线程,同一个进程内的线程可以共享内存空间. 不同线程之间的通信 有进程 管理。 不同线程之间的通信效率高,切换开销小。 3.互斥锁:   共享意味着多个线程的竞争 会导致不安全问题。 为了保护内存空间的数据不被多个线程同时读写, 导致数据隐患, 于是诞生了" 互斥锁 "。 "互斥锁":

Python多进程、多线程、协程

丶灬走出姿态 提交于 2020-01-27 08:27:35
转载:https://www.cnblogs.com/huangguifeng/p/7632799.html 首先我们来了解下python中的进程,线程以及协程! 从计算机硬件角度: 计算机的核心是CPU,承担了所有的计算任务。 一个CPU,在一个时间切片里只能运行一个程序。 从操作系统的角度: 进程和线程,都是一种CPU的执行单元。 进程:表示一个程序的上下文执行活动(打开、执行、保存...) 线程:进程执行程序时候的最小调度单位(执行a,执行b...) 一个程序至少有一个进程,一个进程至少有一个线程。 并行 和 并发: 并行:多个CPU核心,不同的程序就分配给不同的CPU来运行。可以让多个程序同时执行。 cpu1 ------------- cpu2 ------------- cpu3 ------------- cpu4 ------------- 并发:单个CPU核心,在一个时间切片里一次只能运行一个程序,如果需要运行多个程序,则串行执行。 cpu1  ----  ---- cpu1    ----  ---- 多进程/多线程: 表示可以同时执行多个任务,进程和线程的调度是由操作系统自动完成。 进程:每个进程都有自己独立的内存空间,不同进程之间的内存空间不共享。 进程之间的通信有操作系统传递,导致通讯效率低,切换开销大。 线程:一个进程可以有多个线程

python 高性能编程之协程

独自空忆成欢 提交于 2020-01-27 08:24:38
用 greenlet 协程处理异步事件 自从 PyCon 2011 协程成为热点话题以来,我一直对此有着浓厚的兴趣。为了异步,我们曾使用多线程编程。然而线程在有着 GIL 的 Python 中带来的性能瓶颈和多线程编程的高出错风险,“协程 + 多进程”的组合渐渐被认为是未来发展的方向。技术容易更新,思维转变却需要一个过渡。我之前在异步事件处理方面已经习惯了回调 + 多线程的思维方式,转换到协程还非常的不适应。这几天我非常艰难地查阅了一些资料并思考,得出了一个可能并不可靠的总结。尽管这个总结的可靠性很值得怀疑,但是我还是决定记录下来,因为我觉得既然是学习者,就不应该怕无知。如果读者发现我的看法有偏差并指出来,我将非常感激。 多线程下异步编程的方式 线程的出现,为开发者带来了除多进程之外另一种实现并发的方式。比起多进程,多线程有另一些优势,比如可以访问进程内的变量,也就是共享资源。还有的说法说线程创建比进程创建开销低,考虑到这个问题在 Windows 一类进程创建机制很蹩脚的系统才存在,故先忽略。总的来说,线程除了可以实现进程实现的“并发执行”之外,还有另一个功能,就是管理应用程序内部的“事件”。我不知道把这种事件处理分类到异步中是不是合适,但事件处理一定是基于共享进程内资源才能实现的,所以这是多线程可以做到而多进程做不到的一点。 异步处理基于两个前提。第一个前提是支持并发

python进阶之多线程(简单介绍协程)

﹥>﹥吖頭↗ 提交于 2020-01-26 19:22:06
多线程 线程:实现多任务的另一种方式 一个进程中,也经常需要同时做多件事,就需要同时运行多个‘子任务’,这些子任务,就是线程 线程又被称为 轻量级进程 (lightweight process),是更小的执行单元 一个进程可拥有多个并行的(concurrent)线程,当中每一个线程,共享当前进程的资源 一个进程中的线程共享相同的内存单元/内存地址空间可以访问相同的变量和对象,而且它们从同一堆中分配对象通信、数据交换、同步操作 由于线程间的通信是在同一地址空间上进行的,所以不需要额外的通信机制,这就使得通信更简便而且信息传递的速度也更快 线程与进程的区别 一般来讲:我们把进程用来分配资源,线程用来具体执行(CPU调度) 多线程的创建(函数和类) 创建线程的两种方式: 第一:通过 threading.Thread 直接在线程中运行函数; import threading,time def saySorry(): print("子线程%s启动" %(threading.current_thread().name)) #当前线程的名字 time.sleep(1) print("我能吃饭了吗?") if __name__ == "__main__": print('主线程%s启动' %(threading.current_thread().name)) for i in range(5):

网络编程与并发编程参考资料

喜夏-厌秋 提交于 2020-01-26 10:24:07
python 全栈开发,Day32(知识回顾,网络编程基础) python 全栈开发,Day33(tcp协议和udp协议,互联网协议与osi模型,socket概念,套接字(socket)初使用) python 全栈开发,Day34(基于UDP协议的socket) python 全栈开发,Day35(TCP协议 粘包现象 和解决方案) python 全栈开发,Day36(作业讲解(大文件下载以及进度条展示),socket的更多方法介绍,验证客户端链接的合法性hmac,socketserver) python 全栈开发,Day37(操作系统的发展史) python 全栈开发,Day38(在python程序中的进程操作,multiprocess.Process模块) python 全栈开发,Day39(进程同步控制(锁,信号量,事件),进程间通信(队列,生产者消费者模型)) python 全栈开发,Day40(进程间通信(队列和管道),进程间的数据共享Manager,进程池Pool) python 全栈开发,Day41(线程概念,线程的特点,进程和线程的关系,线程和python 理论知识,线程的创建) python 全栈开发,Day42(Thread类的其他方法,同步锁,死锁与递归锁,信号量,事件,条件,定时器,队列,Python标准模块--concurrent.futures)