单线程

【Python协程的实现】

二次信任 提交于 2019-11-28 07:41:31
原文: 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,就会从应用程序级别(而非操作系统)控制切换

5.并发编程协程

℡╲_俬逩灬. 提交于 2019-11-28 04:47:00
一 引子   本节的主题是基于单线程来实现并发,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发,为此我们需要先回顾下并发的本质:切换+保存状态   cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制),一种情况是该任务发生了阻塞,另外一种情况是该任务计算的时间过长或有一个优先级更高的程序替代了它   协程本质上就是一个线程,以前线程任务的切换是由操作系统控制的,遇到I/O自动切换,现在我们用协程的目的就是较少操作系统切换的开销(开关线程,创建寄存器、堆栈等,在他们之间进行切换等),在我们自己的程序里面来控制任务的切换。     ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态   一:其中第二种情况并不能提升效率,只是为了让cpu能够雨露均沾,实现看起来所有任务都被“同时”执行的效果,如果多个任务都是纯计算的,这种切换反而会降低效率。为此我们可以基于yield来验证。yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 import time def

协程

北城余情 提交于 2019-11-28 01:06:25
协程 由于GIL锁导致CPython中多线程无法并发执行,只能并发执行。而并发实现的原理就是切换+保存,那就意味着多线程实现并发,就需要为每一个任务创建一个线程。那就出现了两个问题: 问题一:必然增加了线程创建销毁与切换带来的资源开销。 问题二:高并发情况下,由于任务数量太多导致无法开启新的线程,使得即没有实际任务要执行,也无法创建新线程来处理新任务的情况。 所以应想办法避免创建线程带来的问题,同时又能保证并发效果,==协程就是使用单线程来实现多任务并发==。 协程的本质是程序员自己通过代码自己检测程序中的IO,一旦遇到IO自己通过代码切换,给操作系统的感觉是你这个线程没有任何的IO。 ps:欺骗操作系统,让它误认为你这个程序一直没有IO,从而保证了程序在运行状态和就绪态来回切换,从而提升代码的运行效率。 单线程实现并发 并发 = 切换任务+保存状态。python中的生成器就具备这样一个特定,每次调用next都会回到生成器函数中执行代码,并且是基于上一次运行的结果,这就意味着生成器会自动切换任务并保存执行状态。 # 利用生成器实现单线程的并发效果 def task1(): while True: yield print("task1 run") def task2(): g = task1() while True: next(g) print("task2 run") task2

协程 *单线程实现并发

这一生的挚爱 提交于 2019-11-27 21:24:24
进程: 资源单位 线程: 执行单位 协程: 单线程下实现并发           并发:切换 + 保存状态           ps:看起来像同时执行的就可以称之为并发 协程:完全是程序员自己意淫出来的名词 单线程下实现并发 并发的条件?      多道技术:       空间上的复用       时间上的复用         切换 + 保存状态 实现解释:   程序员自己通过代码自己 检测程序中的IO   一旦遇到IO自己通过代码 自动切换   给操作系统的感觉是你这个线程没有任何的IO    ps:欺骗操作系统,让它误认为你这个程序一直没有IO , 从而保证程序在 运行态和就绪态来回切换,提升代码的运行效率    如何检测 IO ???     导入模块: from gevent import spawn          注意: gevent 模块没办法自动识别 time.sleep 等IO情况             需要你手动再配置一个参数  from gevent import monkey; monkey.patch_all() # 以协程实现服务端并发为例:import socket from gevent import spawn from gevent import monkey; monkey.patch_all() # # 由于该模块经常被使用

【Python协程的实现】

断了今生、忘了曾经 提交于 2019-11-27 21:09:56
原文: 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 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操作的切换反而会降低效率!)

mac gradle 编译时报错 unable to create new native thread

孤街醉人 提交于 2019-11-27 15:14:02
升级到gradle4.1,编译出现unable to create new native thread。 查了一圈,试过改ulimit -a中的值,试过改java 堆栈大小,都不行。 最终,发现开启mac的性能模式能解决该问题。 sudo nvram boot-args="serverperfmode=1 $(nvram boot-args 2>/dev/null | cut -f 2-)" 原因是mac 对单线程创建的线程是有限制,开启性能模式后,单线程上限提升。 可以通过sysctl kern.num_taskthreads 查看单应用线程上限。 通过 sysctl kern.num_threads 查看系统线程上线。 来源: CSDN 作者: wishes2018 链接: https://blog.csdn.net/wishes2018/article/details/83387404

【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,就会从应用程序级别(而非操作系统