python协程

【Python协程的实现】

给你一囗甜甜゛ 提交于 2019-11-27 20:44:00
" 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是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,就会从应用程序级别(而非操作系统)控制切换,以此来提升效率(非io操作的切换反而会降低效率!)

python从入门到放弃之协程

跟風遠走 提交于 2019-11-27 18:52:30
协程 协程,又称微线程,纤程。英文名Coroutine。 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用。 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在执行过程中又调用了C,C执行完毕返回,B执行完毕返回,最后是A执行完毕。 所以子程序调用是通过栈实现的,一个线程就是执行一个子程序。 子程序调用总是一个入口,一次返回,调用顺序是明确的。而协程的调用和子程序不同。 协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。 线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。 协程可以被认为是一种用户空间线程,与传统的抢占式线程相比,有2个主要的优点: 与线程不同,协程是自己主动让出CPU,并交付他期望的下一个协程运行,而不是在任何时候都有可能被系统调度打断。因此协程的使用更加清晰易懂,并且多数情况下不需要锁机制。 与线程相比,协程的切换由程序控制,发生在用户空间而非内核空间,因此切换的代价非常的小。 某种意义上,协程与线程的关系类似与线程与进程的关系,多个协程会在同一个线程的上下文之中运行。 协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程

转搞定python多线程和多进程

跟風遠走 提交于 2019-11-27 15:31:09
转自 https://www.cnblogs.com/whatisfantasy/p/6440585.html 1 概念梳理: 1.1 线程 1.1.1 什么是线程 线程 是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。一个线程是一个execution context(执行上下文),即一个cpu执行时所需要的一串指令。 1.1.2 线程的工作方式 假设你正在读一本书,没有读完,你想休息一下,但是你想在回来时恢复到当时读的具体进度。有一个方法就是记下页数、行数与字数这三个数值,这些数值就是execution context。如果你的室友在你休息的时候,使用相同的方法读这本书。你和她只需要这三个数字记下来就可以在交替的时间共同阅读这本书了。 线程的工作方式与此类似。CPU会给你一个在同一时间能够做多个运算的幻觉,实际上它在每个运算上只花了极少的时间,本质上CPU同一时刻只干了一件事。它能这样做就是因为它有每个运算的execution context。就像你能够和你朋友共享同一本书一样,多任务也能共享同一块CPU。 1.2 进程 一个程序的执行实例就是一个 进程 。每一个进程提供执行程序所需的所有资源。(进程本质上是资源的集合) 一个进程有一个虚拟的地址空间

【Python协程的实现】 -- 2019-08-16 22:07:16

拟墨画扇 提交于 2019-11-27 13:58:02
原文: http://blog.gqylpy.com/gqy/233 " 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是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-08-16 19:03:17

一曲冷凌霜 提交于 2019-11-27 13:34:02
原文: http://blog.gqylpy.com/gqy/233 " 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是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-08-16 18:56:05

一世执手 提交于 2019-11-27 13:31:22
原文: http://blog.gqylpy.com/gqy/233 " 补充 : 数据安全问题 进程: 多个进程操作同一个文件,会出现数据不安全线程: 多个线程操作同一个全局变量,会出现数据不安全 对于共享的数据操作: 如果是 += *= /= -= 操作,都存在数据不安全问题 如果是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 13:15:58
生成器generator 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 生成器函数 函数体中包含yield语句的函数,返回生成器对象 生成器对象,是一个可迭代对象,是一个迭代器 生成器对象,是延迟计算,惰性求值 举例: def inc(): for i in range(5): yield i print(type(inc)) #函数类型 #<class 'function'> print(type(inc())) #生成器类型 #<class 'generator'> x = inc() print(type(x)) print(type(next(x))) for m in x : print(m,'*') for m in x : print(m, '**') """ #执行结果 <class 'function'> <class 'generator'> <class 'generator'> <class 'int'> 1 * 2 * 3 * 4 * """ y = (i for i in range(5)) print(type(y)) print(next(y)) print(next(y)) #执行结果 <class 'generator'> 0 1 普通函数调用fn()

python day33

江枫思渺然 提交于 2019-11-27 10:25:33
今日内容 进程池与线程池 开进程和开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比进程要少 在计算机能够承受范围之内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率,但是保证了计算机的硬件的安全 (硬件的发展跟不上软件的发展速度) 线程池 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor import time import os ​ pool = ThreadPoolExecutor(5) # 括号内可以传参数指定线程内的线程个数,也可以不传,不传默认是当前所在计算机的cpu个数乘5 pool = ProcessPoolExecutor(5) ​ def task(n): print(n) time.sleep(2) return n**2 ​ t_list = [] for i in range(20): res = pool.submit(task,1) # 朝线程池中提交任务,异步提交 print(res.result()) # 原地等待任务的返回结果,将并发变为串行 t_list.append() ​ pool.shutdown() # 关闭池子,等待池子中所有的任务执行完毕后,才会往下运行代码 for p

python生成器

谁说我不能喝 提交于 2019-11-27 05:55:13
目录 生成器 一、yield关键字 二 、 协同程序 生成器 一、yield关键字 yield的英文单词意识就是生产,在函数中但凡出现yield关键字,在调用函数,就不会继续执行函数体代码,而是会返回一个值。 def func(): print(1) yield print(2) yield g = func() print(g) #输出:# generator 生成器 <generator object func at 0x0000019C5C5BD448> 生成器 的本质就是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以认为:生成器提供了非常方便的自定义迭代器的途径。并且从python2.5+开始,[PEP 342:通过增强生成器实现协同程序的实现位生成器加入了更多的特性,这意味着,生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。 def func(): print('from func 1') yield 'a' print('from func 2') yield 'b' g = func() print(g.__iter__()) print(g.__iter__()==g) res1 = g.__next__() print(res1) res2 = next(g) print(res2) #输出: <generator

day14学习整理-Python函数进阶

依然范特西╮ 提交于 2019-11-27 05:48:01
目录 20190813 学习整理 函数进阶 三元表达式 列表推导式 字典生成器 生成器 yield yield+return?? 迭代器套迭代器(了解) 协同程序(了解) send(value): close() throw(type, value=None, traceback=None) 自定义range()方法(了解) 总结(掌握) 生成器表达式(掌握) 生成器表达式和列表推导式 20190813 学习整理 函数进阶 三元表达式 条件成立时的返回值if条件else条件不成立时的返回值 x = 10 y = 20 print(f"x if x > y else y:{ x if x > y else y}") x if x > y else y: 20 列表推导式 [expression for item1 in iterable1 if condition1 for item2 in iterable2 if condition2 ... for itemN in iterableN if conditionN ] 类似于 res=[] for item1 in iterable1: if condition1: for item2 in iterable2: if condition2 ... for itemN in iterableN: if conditionN: