协程

生成器

家住魔仙堡 提交于 2019-12-04 12:00:48
生成器 一、yield关键字 yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。 def func(): print(1) yield print(2) yield g = func() print(g) <generator object func at 0x10ddb6b48> 生成器的本质就是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。并且从Python 2.5+开始,[PEP 342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。 def func(): print('from func 1') yield 'a' print('from func 2') yield 'b' g = func() print(F"g.__iter__ == g: {g.__iter__() == g}") res1 = g.__next__() print(f"res1: {res1}") res2 = next(g) print(f"res2: {res2}") # next(g) # StopIteration g.__iter__ == g: True

Python程序中的协程操作-greenlet模块

泄露秘密 提交于 2019-12-04 09:21:42
Python程序中的协程操作-greenlet模块 一、安装模块 安装:` pip3 install greenlet 二、greenlet实现状态切换 from greenlet import greenlet def eat(name): print('%s eat 1' %name) g2.switch('nick') print('%s eat 2' %name) g2.switch() def play(name): print('%s play 1' %name) g1.switch() print('%s play 2' %name) g1=greenlet(eat) g2=greenlet(play) g1.switch('nick')#可以在第一次switch时传入参数,以后都不需要 单纯的切换(在没有io的情况下或者没有重复开辟内存空间的操作),反而会降低程序的执行速度。 三、效率对比 #顺序执行 import time def f1(): res=1 for i in range(100000000): res+=i def f2(): res=1 for i in range(100000000): res*=i start=time.time() f1() f2() stop=time.time() print('run time is %s' %

python--协程知识初识

余生颓废 提交于 2019-12-04 00:58:08
线程和进程的操作是由程序触发系统接口,最后的执行者是系统;协程的操作则是程序员。 协程存在的意义:对于多线程应用,CPU通过切片的方式来切换线程间的执行,线程切换时需要耗时(保存状态,下次继续)。协程,则只使用一个线程,在一个线程中规定某个代码块执行顺序。 协程的适用场景:当程序中存在大量不需要CPU的操作时(IO),适用于协程; event loop是协程执行的控制点, 如果你希望执行协程, 就需要用到它们。 event loop提供了如下的特性:   1、注册、执行、取消延时调用(异步函数)   2、创建用于通信的client和server协议(工具)   3、创建和别的程序通信的子进程和协议(工具)   4、把函数调用送入线程池中 协程示例一: 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 """ 4 协程示例 5 """ 6 import asyncio 7 8 async def test1(): 9 print("test1, starting") 10 await test2() 11 print("test1, ending") 12 13 async def test2(): 14 print("test2 start") 15 16 loop = asyncio.get_event_loop()

lua游戏开发易错踩坑录

亡梦爱人 提交于 2019-12-04 00:03:20
一。local local函数一定要在调用之前定义(切记,不然会报错或者不能调用该函数) 情况1:监听调此函数后定义 base.model:addlistener("被监听的函数", 监听成功的回调函数) local function 监听成功的回调函数() --处理 end 上面代码运行游戏将会报如下错: handler parameter in addlistener function has to be function, nil not right 二。协程 停止协程前将协程中某变量或组建置空 使用协程做计时功能应注意 1.协程中用到的组件,变量等被置空前,应该将协程置空 2.置空协程之前应停止协程 3.为了确保同一个协程同时只运行一次,可在协程开始前添加安全代码:判断改协程是否存在,存在则停止协程并将协程置空 实现方法: local function setMyTime() --注意(3) if this.countdown then coroutine.stop(this.countdown) this.countdown = nil end this.countdown = coroutine.start(function() while true do this.tm=this.tm-1--用到的变量 coroutine.wait(1) end end) end

day13学python 协程+事件驱动

亡梦爱人 提交于 2019-12-03 23:36:48
day13学python 协程+事件驱动 协程+事件驱动 协程 (微线程)--用处多,重点   当调度切换时 靠寄存器上下文和栈保存 要使用时再调用(即可不会因io传输数据卡壳 从而耗时无法继续进行)实现并行 优缺点: 优点: 1 无需同线程上下文切换 消耗cpu 2 修改数据无需加锁(协程都是单线程串行 无需加锁) 3 cpu支持大量协程 缺点: 1无法调用多核资源(本身是单线程)  --指的是cpu只用单核运作 ============================================================================================================ 接下来介绍两种协程切换的 模板与方法 1.greenlet协程切换(手动挡) 2.gevent协程切换(自动挡) greenlet 模板(手动切换) import greenlet def test1(): print(1) gr2.switch() print(3) gr2.switch() def test2(): print(2) gr1.switch() print(4) if __name__=='__main__': gr1=greenlet.greenlet(test1) #启动协程 函数名作为参数 gr2=greenlet.greenlet

php为什么要用swoole?

a 夏天 提交于 2019-12-03 21:11:02
最近两个月一直在研究 Swoole,那么借助这篇文章,我希望能够把 Swoole 安利给更多人。虽然 Swoole 可能目前定位是一些高级 phper 的玩具,让中低级望而生畏,可能对一些应用场景也一脸懵逼,但其实没这么难的。 在 Swoole 官网的自我介绍是“面向生产环境的 PHP 异步网络通信引擎”,首先 Swoole 它是一个网络应用的开发工具,它支持 Http、TCP、UDP、WebSocket。 Swoole 和我们传统的 PHP 开发差别是有的,需要理解的概念也是有的。使用目前一些基于 Swoole 的框架开发的话,从开发习惯上和传统的TP、LV 框架相差不多。 那为什么要使用 Swoole? 我认为有以下几点: 常驻内存,避免重复加载带来的性能损耗,提升海量性能 协程异步,提高对 I/O 密集型场景并发处理能力(如:微信开发、支付、登录等) 方便地开发 Http、WebSocket、TCP、UDP 等应用,可以与硬件通信 PHP 高性能微服务架构成为现实 常驻内存 目前传统 PHP框架,在处理每个请求之前,都要做一遍加载框架文件、配置的操作。这可能已经成为性能问题的一大原因,而使用 Swoole 则没有这个问题,一次加载多次使用。 协程 说到协程,就得先简单说说进程和线程,众所周知进程是很占用资源的,为了处理请求大量创建进程肯定是得不偿失的。而多线程应用就比较多了

go 学习 (五):goroutine 协程

◇◆丶佛笑我妖孽 提交于 2019-12-03 20:22:15
一、goroutine 基础 定义 使用者分配足够多的任务,系统能自动帮助使用者把任务分配到 CPU 上,让这些任务尽量并发运作,此机制在Go中称作 goroutine goroutine 是 Go语言中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。 Go 程序从 main 包的 main() 函数开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine。 语法 // 普通函数创建 goroutine 语法 go 函数名称(参数列表)     // 匿名函数创建 goroutine 语法 go func(形参列表) {函数体...}(实参列表) // 使用 go 创建 goroutine 后,函数的返回值会被忽略 普通函数创建 goroutine package main import ( "fmt" "math/rand" "time" ) func listElem(n int) { for i:=0; i<n; i++ { fmt.Println(i) } } func main() { go listElem(10) // 若 main 函数中仅有这一句代码,控制台将没有任何输出,因为 main 创建协程后立即推出了,还未来得及执行协程 //添加以下代码

并发编程~~~协程~~~greenlet模块, gevent模块

≡放荡痞女 提交于 2019-12-03 15:30:15
一 协程 1. 协程: 单线程下的并发,又称微线程,纤程.协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 并发真正的核心: 切换并且保持状态. 开启协程并发的执行,自己的程序把控着CPU在多个任务之间来回切换 + 保持状态. 对比操作系统控制线程的切换,用户在单线程内控制协程的切换优缺点: 2. 优点: 1. 协程的切换开销更小,属于程序级别的切换,操作系统完全感知不到,因而更加轻量级 2. 单线程内就可以实现并发的效果,最大限度的利用cpu 3. 缺点: 协程的本质是单线程,无法利用多核. 4. 协程的特点: 必须在只有一个单线程里实现并发 修改共享数据不需要加锁 用户程序里自己保存多个控制流的上下文栈 二 greenlet模块 真正的协程模块就是使用greenlet完成的切换 from greenlet import greenlet import time def eat(name): print(f'{name} eat 1') g2.switch('太白') time.sleep(3) print(f'{name} eat 2') g2.switch() def play(name): print(f'{name} play 1') g1.switch() print(f'{name} play 2') g1 = greenlet(eat) g2 =

python-进程&线程&协程

喜夏-厌秋 提交于 2019-12-03 15:30:01
老规矩,先理解概念 冯诺依曼体系:   输入设备:键盘、鼠标   存储器:内存   输出设备:显示器、投影仪、打印机 程序:一个包含了代码片被编译后的文件 进程:系统通过解析程序文件 加载到内存中 的对象,进程是 资源 分配和调度的 基本单位 (分配cpu, 分配内存大小,它由系统进行调度),进程中包含 指令 (if, for…)、 数据 (变量,函数…)、 线程 (他也是线程的容器),他是操作系统结构的基础。 线程:进程中真正干活的人,线程是 资源调度 的最小单元,是 程序 执行流的最小单元,线程中包含 线程id 、 当前指令的指针 (线程会切换,再次运行还能从阻塞的位置继续), 寄存器集合 (线程切换,这个线程执行的结果进行保存)、 堆栈 (栈是先进后出,执行一个函数要先生成函数对象->函数压栈->变量引用压栈->调用函数->弹出栈顶,线程执行的其实也就是函数中大代码片,从Thread的target参数就能看出来,它接收的是一个函数或则方法) 进程 注释: 1:每一个进程都认为自己独占所有的计算机硬件资源() 2: 进程间不共享数据(这里就要解决进程间通信的问题) 线程 注释:上边已经大致讲了一下线程,这里再说一下线程的特点 1:一个进程中可以有多个线程,同一个进程中的线程共享数据资源(这里需要学好python中的作用域,因为python是用作用域来控制进程中的资源

unity协程要点

守給你的承諾、 提交于 2019-12-03 14:27:31
使用协程做计时功能应注意 1.协程中用到的组件,变量等被置空前,应该将协程置空 2.置空协程之前应停止协程 3.为了确保同一个协程同时只运行一次,可在协程开始前添加安全代码:判断改协程是否存在,存在则停止协程并将协程置空 实现方法: local function setMyTime() --注意(3) if this.countdown then coroutine.stop(this.countdown) this.countdown = nil end this.countdown = coroutine.start(function() while true do this.tm=this.tm-1--用到的变量 coroutine.wait(1) end end) end 注意(2) if this.countdown then coroutine.stop(this.countdown) --注意(1) this.countdown = nil end --假设此时需要对this.tm置空 this.tm=nil 来源: https://www.cnblogs.com/shirln/p/11799719.html