python协程

python 协程, 异步IO Select 和 selectors 模块 多并发演示

被刻印的时光 ゝ 提交于 2019-12-26 00:42:13
主要内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 selectors 模块 多并发演示 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程: 协程是一种用户态的轻量级线程 。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。视作整体是原子性的核心。 方便切换控制流,简化编程模型 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。 缺点: 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上

进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼

二次信任 提交于 2019-12-25 04:33:02
在我之前的一篇博文中详细介绍了Python多线程的应用: 进程,线程,GIL,Python多线程,生产者消费者模型都是什么鬼 但是由于GIL的存在,使得python多线程没有充分利用CPU的多核,为了利用多核,我可以采用多进程; 1. 父进程与子进程 wiki上对于父进程与子进程的定义: a)Parent process In Unix-like operating systems , every process except process 0 (the swapper) is created when another process executes the fork() system call . The process that invoked fork is the parent process and the newly created process is the child process . Every process (except process 0) has one parent process, but can have many child processes. In the Linux kernel , in which there is a very slim difference between processes and POSIX

python进程、线程、协程

∥☆過路亽.° 提交于 2019-12-24 11:50:42
python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和软件组成的。硬件中的CPU是计算机的核心,它承担计算机的所有任务。 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配、任务的调度。 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等。 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块。 进程就是一个程序在一个数据集上的一次动态执行过程。 进程一般由程序、数据集、进程控制块三部分组成。我们编写的程序用来描述进程要完成哪些功能以及如何完成;数据集则是程序在执行过程中所需要使用的资源;进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。 在早期的操作系统里,计算机只有一个核心,进程执行程序的最小单位,任务调度采用时间片轮转的抢占式方式进行进程调度。每个进程都有各自的一块独立的内存,保证进程彼此间的内存地址空间的隔离。 随着计算机技术的发展,进程出现了很多弊端,一是进程的创建、撤销和切换的开销比较大,二是由于对称多处理机(对称多处理机(SymmetricalMulti-Processing)又叫SMP,是指在一个计算机上汇集了一组处理器(多CPU)

python基础—迭代器、生成器

淺唱寂寞╮ 提交于 2019-12-23 14:43:13
python基础—迭代器、生成器 1 迭代器定义 迭代的意思是重复做一些事很多次,就像在循环中做的那样。 只要该对象可以实现__iter__方法,就可以进行迭代。 迭代对象调用__iter__方法会返回一个迭代器,所谓的迭代器就是具有next方法的对象。(在调用next方法时不需要任何参数)。在调用next方法时,迭代器会返回它的下一个值。如果next方法被调用,但迭代器没有值可以返回,就会引发一个StopITeration异常。 一个实现了__iter__方法的对象是可迭代的,一个实现了next方法的对象是迭代器。 迭代器也有__iter__方法。 2 迭代器特性 优点: 1 迭代器提供了一种不依赖索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件) 2 迭代器与列表比较,迭代器是惰性计算的,更节省内存 缺点: 1 无法获取迭代器的长度,使用不如列表索引取值灵活 2 一次性的,只能往后取值,不能倒着取值 迭代规则的关键是?为什么不是使用列表? 1 如果有一个函数,可以一个接一个地计算值,那么在使用时可能是计算一个值时获取一个值,而不是像列表一样获取所有的值。如果有很多值,列表会占用太多的内存。 2 使用迭代器更通用,更简单,更优雅 3 迭代器代码 (1)索引方式循环 1 2 3 4 5 6 7 l = [ 'a' , 'b' , 'c' , 'd' ] i

python 之 线程,进程,协程

泪湿孤枕 提交于 2019-12-23 07:09:16
python 线程: Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。 1 #!/usr/bin/env python 2 #_*_ coding:utf-8 _*_ 3 import threading 4 import time 5 6 def show(arg): 7 time.sleep(1) 8 print('threading' + str(arg)) 9 10 for i in range(10): 11 t = threading.Thread(target=show, args=(i,)) 12 t.start() 13 14 print ('main thread stop!') 上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。 更多方法: start 线程准备就绪,等待CPU调度。 setName 为线程设置名称。 getName 获取线程名称。 setDaemon 设置为后台线程或前台线程(默认)。           如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止。           如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后等待前台线程也执行完成后,程序停止。 join 逐个执行每个线程

Python-线程、进程、协程

倖福魔咒の 提交于 2019-12-23 07:08:55
Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 import threading 4 import time 5 6 def show(arg): 7 time.sleep(1) 8 print 'thread'+str(arg) 9 10 for i in range(10): 11 t = threading.Thread(target=show, args=(i,)) 12 t.start() 13 14 print 'main thread stop' 上述代码创建了10个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。 更多方法: start 线程准备就绪,等待CPU调度 setName 为线程设置名称 getName 获取线程名称 setDaemon 设置为后台线程或前台线程(默认) 如果是后台线程,主线程执行过程中,后台线程也在进行,主线程执行完毕后,后台线程不论成功与否,均停止 如果是前台线程,主线程执行过程中,前台线程也在进行,主线程执行完毕后,等待前台线程也执行完成后,程序停止 join 逐个执行每个线程,执行完毕后继续往下执行,该方法使得多线程变得无意义 run

python基础之面试常问

半世苍凉 提交于 2019-12-21 01:50:29
目录 python相对其他语言有什么特点? python内存管理机制,gc机制的了解,gc回收三种算法。 lambda函数 高级函数 map、reduce、filter、sorted等。 简述六种基本数据类型(number、string、list、tuple、dict、set)。 python中深拷贝与浅拷贝。 python中is和==的区别。 python中if __ name ==' main __'有什么含义? python命令和python -m命令在执行脚本时的区别? python中多进程、多线程、协程。 python中迭代器、生成器。 python中装饰器。 python中单引号、双引号、三引号的应用场景与区别。 python如何体现面对对象的三大特性。 python中异常管理的机制。 python函数闭包。 参考: python面试常问 python相对其他语言有什么特点? python内存管理机制,gc机制的了解,gc回收三种算法。 python内存管理( 原博文——python内存管理 ) python是动态语言,对象与引用分类,一个变量使用不需要事先声明,而在赋值时,变量可以重新赋值为任意值。 python中,整数和短小的字符,Python都会缓存这些对象,以便重复使用。当我们创建多个等于1的引用时,实际上是让所有这些引用指向同一个对象。

深入理解Python中的生成器

一笑奈何 提交于 2019-12-20 18:11:55
生成器(generator)概念 生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束。 生成器语法 生成器表达式: 通列表解析语法,只不过把列表解析的[]换成() 生成器表达式能做的事情列表解析基本都能处理,只不过在需要处理的序列比较大时,列表解析比较费内存。 >>> gen = (x**2 for x in range(5)) >>> gen <generator object <genexpr> at 0x0000000002FB7B40> >>> for g in gen: ... print(g, end='-') ... 0-1-4-9-16- >>> for x in [0,1,2,3,4,5]: ... print(x, end='-') ... 0-1-2-3-4-5- 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器函数。 但是生成器函数可以生产一个无线的序列,这样列表根本没有办法进行处理。 yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator。 下面为一个可以无穷生产奇数的生成器函数。 def odd(): n=1 while True:

python协程的理解

十年热恋 提交于 2019-12-19 09:48:57
一、介绍 什么是并发? 并发的本质就是切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制): 1.任务发生阻塞 2.计算任务时间过长,需要让出cpu给高优先级的程序 协程,又称微线程,是一种用户态的轻量级线程。协程能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置,当程序中存在大量不需要CPU的操作时(IO),适用于协程。 协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,现在我们用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在我们自己的程序里面来控制任务的切换 进程有三种状态,而线程是进程的执行最小单位,所以也是线程的三种状态 二、协程切换 1.yield是一种在单线程下可以保存任务运行状态的方法 1. yiled 可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 2. send 可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 通过yield实现任务切换+保存线程: import time def func1(): for i in range(11): print('func1第%s次打印' % i) time

开发的意义

让人想犯罪 __ 提交于 2019-12-16 12:57:33
身为一名程序员,如果不在某个领域一直专研下去,是很难得到质的提升的。 今年最大的技术收获就是有幸能够用springcloud开发一个车联网的项目,之前一直止步于理论层面,一直没有真正接触过springcloud的项目,不得不说,新东西确实有她的实用价值,不过要求我们懂的更多,学的更多,做的也更加精细,才能在合适的时机利用她。细节我就不多说了,摘用玥姐的一句话“巨人,很高,但难翻身” 其次今年更多做的是业务层面的,项目多、但不精,没有一个超过三年的项目,扪心自问,自己这几年都是这样,都仅仅是做业务需求,焦点都在某个产品的实现,在和客户、测试们沟通,用的更多的也都是直接拿开源的项目,甚至付费的项目,这点也挺无奈的 三、经验的累积 今年真正安安心心踏踏实实的做了一个上线的app(名字我就不说了),并一路维护版本的迭代更新,除了业务领域的深度认识以外,还累积了很多做人做事的经验; 产品经理完全站在客户的角度出发:新需求下来了,主要是这几个大的模块,你们先把功能拆分一下,评估一下工时。 第二天:我们能不能这样做点改动,这样便于推广。 第三天:最终定的需求还是最开始一样,因为客户说月底要做活动,我们两个周就要交出去。 我猜你根本没看我写的开发计划? 实际上留给我们开发的时间算上周末也只就有十天,你以为完了吗,太年轻,测试也不是省油的灯 第四天测试leader发话了:你们出个提测计划吧