协程

python进程、线程、协程

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

关于Unity的协程(Coroutine)

六月ゝ 毕业季﹏ 提交于 2019-12-24 04:57:53
参考博客: http://www.unity.5helpyou.com/2658.html 什么是协程?(又称协同程序) 协程类似于函数,可以暂停执行(yield return xxx 之后的代码) , 在下一帧时再次判断是否继续执行。 协程不是多线程,它与主线程同时运行,它在主线程运行的同时开启另一段逻辑处理,类似一个子线程单独出来处理一些问题,性能开销较小,,Unity的协程会在每帧结束之后去检测yield的条件是否满足,满足则执行yield return之后的代码。 在一个MonoBehaviour提供的主线程里只能有一个处于运行状态的协程,而其他协程处于休眠状态。协程实际上是在一个线程中,只不过每个协程对CUP进行分时,协程可以访问和使用unity的所有方法和component。 (1)协程的定义: IEnumrator 函数名(形参表) //最多只能有一个形参 { yield return xxx; } (2)关于协程的开启和停止这里就不再赘述了,网上很多资料。 (3)关于协程的中断指令,即 yield return 后面的指令 yield break; 停止协程 yield return www; 等待一个WWW加载完成 yield return 0/null/数字; 暂停一帧,一般使用null yield return new WaitForSeconds(时间);

深入理解协程(一):协程的引入

我与影子孤独终老i 提交于 2019-12-24 04:07:58
原创不易,转载请注明出处 深入理解协程 分为三部分进行讲解: 协程的引入 yield from实现协程 async/await实现异步协程 本篇为 深入理解协程 文章的第一篇。 什么是协程 协程 :英文叫做 Coroutine,又称微线程,纤程,是一种用户态的轻量级线程。 本质上是单线程 ,拥有自己的寄存器上下文和栈。所以能保留上一次调用时的状态,每次过程重入时,就相当于进入上一次调用的状态。 与多进程相比,无需线程上下文切换的开销;与多线程相比,无需使用多线程的锁机制。执行效率要高于多进程和多线程。 最简单的协程 在Python2.5时引入,是通过生成器(generator)实现的。下面来看一下生成器实现的最简单的协程。 >>> def coroutine(): # 注释一 print('-> coroutine started') x = yield # 注释二 print('-> coroutine received:', x) >>> c = coroutine() # 注释三 >>> c <generator object coroutine at 0x03899230> >>> next(c) # 注释四 -> coroutine started >>> c.send(1) # 注释五 -> coroutine received: 1 Traceback (most

转发:几个常见的 NodeJS 误区

Deadly 提交于 2019-12-23 19:03:14
很多不熟悉 NodeJS 的开发者,总是对 NodeJS 抱有怀疑态度,其中的原因基本是对其具有误解,而这些误解往往又最终导致自己放弃 NodeJS 的学习。在这篇文章里,我将会尽可能言简意赅的介绍和解释这些误区的所在之处,并不遗余力地挽留那些正在迷茫中的人,同时增强正在使用 NodeJS 的开发者们的信心。 一、 NodeJS 是一门服务器语言 这个错误非常明显,NodeJS 是一个使用 Chrome V8 引擎运行 JavaScript 程序的运行时环境,正如 JRE (Java Runtime Environment) 是 Java 程序的运行环境一样,语言还是 JavaScript,和我们在浏览器中运行 JS 脚本没什么不同。区别在于,NodeJS 提供了一整套用于服务器编程(准确来说应该是除网页编程外)的工具包,例如处理网络连接的 net, http, https 模块,用于读写文件的 fs 模块等,以及 NPM 仓库中数十万的第三方模块。这些模块,加上 NodeJS 运行时,为 JavaScript 语言提供了跨平台、跨领域的编程能力。 除了服务器编程,NodeJS 还被广泛应用于客户端编程,如桌面软件( Electron 框架),手机软件( React-Native 框架, Apache Cordova 框架)等,当然还有现在特别火的“前端”开发,例如 React

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

Swoole协程与传统fpm同步模式比较

▼魔方 西西 提交于 2019-12-21 22:02:24
如果说数组是 PHP 的精髓,数组玩得不6的,根本不能算是会用PHP。那协程对于 Swoole 也是同理,不理解协程去用 Swoole,那就是在瞎用。 首先,Swoole 只能运行在命令行(Cli)模式下,所以我们开发调试都是使用命令行,而不是 php-fpm/apache 等。 在 Swoole 中,我们可以使用 `\Swoole\Coroutine::create()` 创建协程,或者你也可以使用简写`go()`。 初识 Swoole 协程 go(function(){ go(function(){ echo 0, PHP_EOL; }); echo 1, PHP_EOL; }); go(function(){ echo 2, PHP_EOL; }); go(function(){ echo 3, PHP_EOL; }); 执行结果: 0 1 2 3 Swoole 协程与同步模式比较 我们一直在说 Swoole 协程适合用于 I/O 密集场景,在同样的硬件配置环境下,它会比传统的同步模式承载更多的访问量。 我们熟悉的文件读写、网络通讯请求(MySQL、Redis、Http等)都是属于 I/O 密集型场景。 假设一次 SQL 查询为 100ms,在传统同步模式下,当前进程在这 100ms 的时间里,是不能做其它操作的。如果要执行十次这个 SQL,可能需要耗费 1s 以上。

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

php有必要用swoole吗

三世轮回 提交于 2019-12-19 06:57:33
在 Swoole 官网的自我介绍是“面向生产环境的 PHP 异步网络通信引擎”,首先 Swoole 它是一个网络应用的开发工具,它支持 Http、TCP、UDP、WebSocket。 Swoole 和我们传统的 PHP 开发差别是有的,需要理解的概念也是有的。使用目前一些基于 Swoole 的框架开发的话,从开发习惯上和传统的TP、LV 框架相差不多。 那为什么要使用 Swoole? 我认为有以下几点: 常驻内存,避免重复加载带来的性能损耗,提升海量性能 协程异步,提高对 I/O 密集型场景并发处理能力(如:微信开发、支付、登录等) 方便地开发 Http、WebSocket、TCP、UDP 等应用,可以与硬件通信 PHP 高性能微服务架构成为现实 常驻内存 目前传统 PHP框架,在处理每个请求之前,都要做一遍加载框架文件、配置的操作。这可能已经成为性能问题的一大原因,而使用 Swoole 则没有这个问题,一次加载多次使用。 协程 说到协程,就得先简单说说进程和线程,众所周知进程是很占用资源的,为了处理请求大量创建进程肯定是得不偿失的。而多线程应用就比较多了,在 CPU 层面有几个核心就会执行几个任务,线程一旦创建的多了,就会有线程调度的损耗。 协程是在单线程基础上实现的,它可以最大限度利用 CPU 资源,而不会在等待 I/O 时白白浪费。当然,协程数越多占用的内存也就越多

进程、线程、轻量级进程、协程和go中的Goroutine 那些事儿

橙三吉。 提交于 2019-12-19 05:07:48
电话面试被问到go的协程,曾经的军伟也问到过我协程。虽然用python时候在Eurasia和eventlet里了解过协程,但自己对协程的概念也就是轻量级线程,还有一个很通俗的红绿灯说法:线程要守规则,协程看到红灯但是没有车仍可以通行。现在总结各个资料,从个人理解上说明下 进程 线程 轻量级进程 协程 go中的goroutine 那些事儿。 一、进程 操作系统中最核心的概念是进程,分布式系统中最重要的问题是进程间通信。 进程 是“程序执行的一个实例” ,担当分配系统资源的实体。进程创建必须分配一个完整的独立地址空间。 进程切换 只发生在内核态,两步:1 切换页全局目录以安装一个新的地址空间 2 切换内核态堆栈和硬件上下文。 另一种说法类似:1 保存CPU环境(寄存器值、程序计数器、堆栈指针)2修改内存管理单元MMU的寄存器 3 转换后备缓冲器TLB中的地址转换缓存内容标记为无效。 二、线程 书中的定义:线程是进程的一个执行流,独立执行它自己的程序代码。 维基百科: 线程 ( 英语 : thread )是 操作系统 能够进行运算 调度 的最小单位。 线程上下文一般只包含CPU上下文及其他的线程管理信息。线程创建的开销主要取决于为线程堆栈的建立而分配内存的开销,这些开销并不大。线程上下文切换发生在两个线程需要同步的时候,比如进入共享数据段。切换只CPU寄存器值需要存储