协程

一、初识asyncio协程

匿名 (未验证) 提交于 2019-12-03 00:09:02
阻塞 非阻塞 同步 异步 并发 并行 协程 asyncio 是用来编写并发代码的库,被用作多个提供高性能异步框架的基础,往往是构建I/O密集型和高层级结构化网络代码的最佳选择。 asyncio 的使用方法前,首先有必要先介绍一下,这几个贯穿始终的概念: event_loop事件循环: 程序开启一个无限的事件循环,程序员会把一些函数注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。 coroutine协程: 协程对象,指一个使用 async 关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。 task任务: 一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。 future对象: 代表将来执行或没有执行的任务的结果,与 task 没有本质上的区别。 async/await关键字: python3.5 用于定义协程的关键字, async 定义一个协程, await 用于挂起阻塞的异步调用接口。 from collection . abc import Coroutine async def a ( name ): print ( 'hello' , name ) if __name__ == '__main__' : test = a ( 'world' ) # 输出

Go语言中单例模式once.Do只执行一次

匿名 (未验证) 提交于 2019-12-02 23:47:01
package singleton import ( "unsafe" "fmt" "sync" "testing" ) //协程安全 单例模式 type Singleton struct { } var singleintance *Singleton var once sync.Once //只执行一次 func GetSingletonObj() *Singleton { once.Do(func() { fmt.Println("Create Obj") singleintance = new(Singleton) }) return singleintance } func TestGetSingletonObj(t *testing.T) { var wg sync.WaitGroup //协程安全 for i := 0; i < 10; i++ { wg.Add(1) go func() { obj := GetSingletonObj() fmt.Printf("%x\n",unsafe.Pointer(obj))//输出的结果都是同一个地址 wg.Done() }() } wg.Wait() //等待是有协程运行完成 } 使用noce.Do调用时方法内执行代码只执行一次。 输出结果: Create Obj 6c7df8 6c7df8 6c7df8 6c7df8

初识Lua

匿名 (未验证) 提交于 2019-12-02 23:47:01
  前几天为了用xLua,学习了Lua语言,算是能用了...吧?(其实就只是跟着过了一遍....)。但是感觉自己的记性一天不如一天(Orz),还是写个笔记好了,可能会对比着C++来。欢迎批评指正或者补充~ 一.基础 ( 几乎语言都有的东西 )     Lua的数据类型很少,只有8种: nil、boolean、number、string、userdata、function、thread、table。     nil 和C++里的 NULL 比较像,不过要注意的是,type(nil)~=nil 因为type()函数返回的是string。     string 可以用 " ", ' ', [[ ]] 来包裹。其中[[ ]]一般包裹一整块的字符串。     userdata 一般存储C/C++数据。     function 用...来表示可变长参数,并且可以返回多个值。     thread 我也只看了协程部分,见下文。     table 是一个有点想法的数据结构。其组成是 一个数组 和 一个hash表 (我都想要.jpg)。数组的扩张方法是*2(也就是说 capacity永远是2^n )。   2.语法词法      特殊的算术运算符和关系运算符:幂运算是 ^ ,不等于是 ~= 。     逻辑运算符:and,or,not     长度运算符:#

Unity-动态显示窗口制作思路

匿名 (未验证) 提交于 2019-12-02 23:45:01
此教程来自siki学院的<<暗黑战神>>课程 这次需要记录的是动态显示窗口的制作方式,它的效果是弹出一条游戏Tips,上面可以显示你想显示的内容,随后消失。 显然,我们只需要制作一个动画,动画中改变Text组件的位置即可实现此效果。 然而现在的问题是,不能让这个动画立刻播放,我们需要在特定的时候去播放它,并在特定的时刻停止。 那么怎么实现呢? 我们可以在控制动态显示窗口的脚本中,设置一个方法,当要显示动态Tips时,设置改变Text内容,并激活对应的游戏物体,手动控制动画播放。 注意, 游戏物体不激活时即使动画是自动播放的,也不会播放,只有激活了,才会从头开始播放 。 动画播放后需要停止,因此需要把游戏物体取消激活,但我们在代码中怎么准确地控制它能延时取消激活呢? 这个问题和之前说的异步加载资源服务有点类似,传送门如下: https://www.cnblogs.com/czw52460183/p/11044456.html 当时的思路是在Update中用委托实时查看加载进度,但这里就不行,因为我们没有什么方法可以实时获取到动画播放进度,怎么办呢? 答案是可以使用协程,我们只需要在开启协程后,让它在固定等待一段时间后调用回调方法即可,在这个回调方法中去关闭物体的激活状态即可,而这个等待的时间,就设置成动画的持续时长即可,这样,即使我们没有办法掌握动画的实际播放进度,也可以实现延时关闭

协程技术

匿名 (未验证) 提交于 2019-12-02 23:45:01
基础概念 1.定义:纤程,微线程。是为非抢占式多任务产生子程序的计算机组件。协程允许不同入口点在不同位置暂停或开始,简单来说,协程就是可以暂停执行的函数。 2.协程原理 : 记录一个函数的上下文栈帧,协程调度切换时会将记录的上下文保存,在切换回来时进行调取,恢复原有的执行内容,以便从上一次执行位置继续执行。 3.协程优缺点 优点: 协程完成多任务占用计算资源很少 由于协程的多任务切换在应用层完成,因此切换开销少 协程为单线程程序,无需进行共享资源同步互斥处理 缺点:协程的本质是一个单线程,无法利用计算机多核资源 标准库协程的实现 python3.5以后,使用标准库asyncio和async/await 语法来编写并发代码。asyncio库通过对异步IO行为的支持完成python的协程。虽然官方说asyncio是未来的开发方向,但是由于其生态不够丰富,大量的客户端不支持awaitable需要自己去封装,所以在使用上存在缺陷。更多时候只能使用已有的异步库(asyncio等),功能有限。 第三方协程模 1.greenlet模块 安装 : sudo pip3 install greenlet 函数 greenlet .greenlet (func ) 功能:创建协程对象 参数:协程函数 g .switch ( ) 功能:选择要执行的协程函数 1 from greenlet import

商汤科技一面

匿名 (未验证) 提交于 2019-12-02 23:34:01
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/strivenoend/article/details/90381840 1介绍一下你的项目吧 2后端语言你用什么?? 3hr说你的csdn好像还不错? 4说一下你项目的增删改查,你通常都是什么思路去做项目的呢? 5数据库设计表结构,你怎么优化的,后期数据维护这你怎么做的? 如果数据量很大的话你怎么优化呢? 【数据量大如何处理】 优化顺序 第一,优化你的sql和索引;   想实现一个查询,可以写出很多种查询语句,不同的语句,根据你选择的引擎、表中数据的分布情况、索引情况、数据库优化策略、查询中的锁策略等因素,最终查询的效率相差很大;优化要从整体去考虑,有时你优化一条语句后,其它查询反而效率被降低了,所以要取一个平衡点。 第二,加缓存,memcached,redis; 第三,主从复制或主主复制,读写分离; 第四 ,先删,在汇总(这是面试官给出的idea) 第五,分库分表 【优化表结构】 很多人都将 数据库设计范式 作为数据库表结构设计“圣经”,认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求。殊不知,在N年前被奉为“圣经”的数据库设计3范式早就已经不完全适用了。这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用。

异步协程太吊了!以亲测!简直完美,Python异步协程的葵花宝典!

匿名 (未验证) 提交于 2019-12-02 22:56:40
2.1 阻塞 阻塞状态指程序未得到所需计算资源时被挂起的状态。程序在等待某个操作完成期间,自身无法继续干别的事情,则称该程序在该操作上是阻塞的。 常见的阻塞形式有:网络 I/O 阻塞、磁盘 I/O 阻塞、用户输入阻塞等。阻塞是无处不在的,包括 CPU 切换上下文时,所有的进程都无法真正干事情,它们也会被阻塞。如果是多核 CPU 则正在执行上下文切换操作的核不可被利用。 2.5 多进程 多进程就是利用 CPU 的多核优势,在同一时间并行地执行多个任务,可以大大提高执行效率。 2.6 协程 协程,英文叫做 Coroutine,又称微线程,纤程,协程是一种用户态的轻量级线程。 3.1 定义协程 首先我们来定义一个协程,体验一下它和普通进程在实现上的不同之处,代码如下: 首先我们引入了 asyncio 这个包,这样我们才可以使用 async 和 await,然后我们使用 async 定义了一个 execute() 方法,方法接收一个数字参数,方法执行之后会打印这个数字。 这里我们定义了 loop 对象之后,接着调用了它的 create_task() 方法将 coroutine 对象转化为了 task 对象,随后我们打印输出一下,发现它是 pending 状态。接着我们将 task 对象添加到事件循环中得到执行,随后我们再打印输出一下 task 对象,发现它的状态就变成了 finished

铁乐学python_Day43_协程

匿名 (未验证) 提交于 2019-12-02 22:51:30
铁乐学python_Day43_协程 之前我们学习了线程、进程的概念,了解了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位。 按道理来说我们已经算是把cpu的利用率提高很多了。 但是我们知道无论是创建多进程还是创建多线程来解决问题, 都要消耗一定的时间来创建进程、创建线程、以及管理他们之间的切换。 随着我们对于效率的追求不断提高,基于单线程来实现并发又成为一个新的课题, 即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。 这样就可以节省创建线进程所消耗的时间。 为此我们需要先回顾下并发的本质:切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制), 一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长。 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态。 运行、阻塞、就绪。 1、进程在运行状态下遇到io之类等待输入而进入阻塞状态; 2、调度程序选择另一个就绪状态中的进程; 3、调度程序选择就绪的进程转到运行状态; 4、之前阻塞状态下的进程出现有效输入后切换到就绪状态,而不能马上进入运行状态。 一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果, 如果多个任务都是纯计算的

Python协程,完美掌握!

匿名 (未验证) 提交于 2019-12-02 22:51:30
声明:本人的一切著作,禁止用于以营销为目的的任何转载! 前言 很久以前就听说 Python 的 async/await 很厉害,但是直到现在都没有用过,一直都在用多线程模型来解决各种问题。最近看到隔壁的 Go 又很火,所以决定花时间研究下 Python 协程相关的内容,终于在翻阅了一裤衩的资料之后有了一些理解。 起:一切从生成器开始 以往在 Python 开发中,如果需要进行并发编程,通常是使用多线程 / 多进程模型实现的。由于 GIL 的存在,多线程对于计算密集型的任务并不十分友好,而对于 IO 密集型任务,可以在等待 IO 的时候进行线程调度,让出 GIL,实现『假并发』。 当然对于 IO 密集型的任务另外一种选择就是协程,协程其实是运行在单个线程中的,避免了多线程模型中的线程上下文切换,减少了很大的开销。为了理解协程、async/await、asyncio,我们要从最古老的生成器开始。 回顾 Python 的历史,生成器这个概念第一次被提出的时候是在PEP 255中被提出的,当时的 Python 版本为 Python2.2。我们都知道range()函数,现在考虑一下我们来编写一个自己的range()函数,最直接最容易想到的方法也许是这样: 当你想创建一个很小的序列的时候,例如创建从 0 到 100 这样的列表,似乎没什么问题。但是如果想创建一个从 0 到 999999999

Python连载42-异步协程函数

匿名 (未验证) 提交于 2019-12-02 22:51:30
1.python3.4开始引入标准库之中,内置对异步io的支持 2.asyncio本身是一个消息循环 3.步骤: (1)创建消息循环 (2)把协程导入 (3)关闭 4.举例: import threading #引入异步io包 import asyncio #使用协程 @asyncio.coroutine def hello(): print("Hello World!(%s)"%threading.current_thread()) print("Start......(%s)"%threading.current_thread()) yield from asyncio.sleep(5) print("Done.....(%s)"%threading.current_thread()) print("Hello again!(%s)"%threading.current_thread()) #启动消息循环 loop = asyncio.get_event_loop() #定义任务 tasks = [hello(),hello()] #asyncio使用wait等待task执行完毕 loop.run_until_complete(asyncio.wait(tasks)) #关闭消息循环 loop.close() 二、asyncio and await 1.为了更好的表示异步io