协程

获取 协程 ID

半城伤御伤魂 提交于 2019-12-02 19:28:23
在go语言中,谷歌开发者不建议大家获取协程ID,主要是为了GC更好的工作,滥用协程ID会导致GC不能及时回收内存 golang从1.4版以后就删去了获取协程ID的接口,但有时为调试方便,还是希望能获取打印出来 本文介绍的方法是使用runtime.Stack函数从堆栈中取出信息分析,截取出协程ID func GetGoroutineID() uint64 { b := make([]byte, 64) runtime.Stack(b, false) b = bytes.TrimPrefix(b, []byte("goroutine ")) b = b[:bytes.IndexByte(b, ' ')] n, _ := strconv.ParseUint(string(b), 10, 64) return n }    分析: 首先rumtime.Stack(b,false)会取出堆栈信息类似放入b中,堆栈信息类似: goroutine 1 [running]: main.main() C:/Users/zuma/Desktop/gowork/src/github.com/0990/gotool/main.go:10 +0x74 然后从第一行中取出goroutine后面的数字 1即代表这个协程的ID 来源: https://www.cnblogs.com/yorkyang/p

进程线程协程

北城以北 提交于 2019-12-02 16:24:45
一、进程   进程(Process)是保存在硬盘上的程序运行以后,会在内存空间里形成一个独立的内存体,这个内存体有自己独立的地址空间,有自己的堆,上级挂靠单位是操作系统。操作系统会以进程为单位,分配系统资源(CPU时间片、内存等资源), 进程是资源分配的最小单位 。进程是一个实体,每一个进程都有它自己的内存空间 进程和程序的区别: 进程:一堆代码 程序:正在运行的程序 理论基础: 一 操作系统的作用: 隐藏丑隨复杂的硬件接口,提供良好的抽象接口 管理调度进程并且将多个进程对硬件的竞争变得有序 二多道技术 : 1.产生背员:针对单核,实现并发   ps:   现在的主机一般是多核,那么每个被都会利用多道技术   有4个cpu.运行于cpu1的某个程序遇到1o阻塞,会等到:o结束再重新调度,会被调度到4个 cpu中的任意一个,具体由操作系统调度算法决定, 2.空间上的复用:如内存中同时有多道程序 3.时间上的复用:复用一个cpu的时间片   强调:遇到1o切,占用cpu时间过长也切。核心在于切之前将进程的状态保存下来,这样   才能保证下次切换回来时,能基于上次切走的位置继续运行 时间片:    时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行

day31总结

你离开我真会死。 提交于 2019-12-02 16:02:03
目录 线程队列 线程定时器 线程池和进程池 进程池和线程池--- concurrent.futures 什么时候用进程池还是什么时候用线程池? 线程池和信号量的区别 协程 什么是协程 什么样的协程是有意义的 为什么要有协程 gevent模块实现I/O监测和任务切换 线程队列 import queue q = queue.Queue(2) q.put('蔡启龙') # q.put('才气龙') print(q.get()) # 蔡启龙 q.task_done() q.join() q = queue.LifoQueue() # last in first out 先进后出队列---堆栈 q.put('123') q.put('456') print(q.get()) # 456 q = queue.PriorityQueue() # 优先级队列,可以根据优先级取数据 q.put('2') q.put('1') q.put('3') print(q.get()) # 1 # 通常放入的元组数据第一个值是int类型,数值小的先取出 线程定时器 import threading import time def task(): print('开始...') time.sleep(3) print('结束...') t = threading.Timer(5, task) #

Go语言中协程的概念和基本使用

别来无恙 提交于 2019-12-02 14:36:00
Go协程(Goroutine)是与其他函数同时运行的函数。可以认为Go协程是轻量级的线程。与创建线程相比,创建Go协程的成本很小。因此在Go中同时运行上千个协程是很常见的。 1、 Go语言的并发性 Go语言原生就支持了高并发操作,这一优秀基因在目前主流的编程语言中是比较少见的,Go语言的高并发性主要是通过 Go协程(Goroutine)来实现的。 协程的特点 协程是一个轻量级的线程,此处可以与进程、线程、协程 进行对比 Go协程是非抢占式多任务处理,需要由协程主动交出控制权 协程是一个 虚拟机层面的多任务处理 多个协程可能运行在一个或者多个线程上 Go语言实现协程,只需要在函数前添加 go 关键字,就可以使此函数并发执行 示例代码如下: package main import ( "fmt" "time" ) func main() { for i := 0; i < 1000; i++ { go func(i int) { for { fmt.Printf("Hello from "+"goroutine %d\n", i) } }(i) } time.Sleep(time.Millisecond) } 2、其他语言中的协程 C++ 可以通过 Boost.Coroutine 库实现协程。 Java 不支持协程 Python 3.5 加入了 async def 对协程的支持

[转帖]进程,线程,协程

橙三吉。 提交于 2019-12-02 10:21:01
进程,线程,协程 https://yq.aliyun.com/articles/53673?spm=a2c4e.11155435.0.0.48bfe8efHUE8wg kryptosx 2016-05-27 23:57:28 浏览4067 最早出现的是进程,后来为了调度的方便出现了线程,现在又蹦出了一个协程。这到底是个什么东西呢。 并发和并行: 最早的计算机,每次只能执行一个程序,别的都得等着。到后来,计算机运算速度提高了,于是就想要同一时间执行那么三五个程序,几个程序能一块跑一跑。特别是UI什么的,别跑个程序得排队等着。于是就有了并发。 从程序员的角度可以看成是多个独立的逻辑流。把单cpu时间分片,能快速的切换逻辑流,看起来像是大家一块跑的。这个时候内存其实是共享的。后来一电脑上有了好几个cpu,好咧,大家都别闲着,可以一块跑。就是所谓的并行。 进程: 但是一块跑也有问题。我的程序计算到一半,刚把多次方程解到最后一步,你突然插进来,我的中间状态咋办,我用来储存的内存被你覆盖了咋办?所以跑在一个cpu里面的并发都需要处理上下文切换的问题。进程就是这样抽象出来个一个概念,搭配虚拟内存、进程表之类的东西,用来管理独立的程序运行、切换。 因为程序的使用涉及大量的计算机资源配置,把这活随意的交给用户程序,容易让整个系统被搞挂,资源分配也很难做到相对的公平。所以就出现了操作系统

python协程详解

你说的曾经没有我的故事 提交于 2019-12-02 08:05:34
python协程详解 一、什么是协程 协程又称为微线程,协程是一种用户态的轻量级线程 协程拥有自己的寄存器和栈。协程调度切换的时候,将寄存器上下文和栈都保存到其他地方,在切换回来的时候,恢复到先前保存的寄存器上下文和栈,因此:协程能保留上一次调用状态,每次过程重入时,就相当于进入上一次调用的状态。 协程的好处: 1.无需线程上下文切换的开销(还是单线程) 2.无需原子操作(一个线程改一个变量,改一个变量的过程就可以称为原子操作)的锁定和同步的开销 3.方便切换控制流,简化编程模型 4.高并发+高扩展+低成本:一个cpu支持上万的协程都没有问题,适合用于高并发处理 缺点: 1.无法利用多核的资源,协程本身是个单线程,它不能同时将单个cpu的多核用上,协程需要和进程配合才能运用到多cpu上(协程是跑在线程上的) 2.进行阻塞操作时会阻塞掉整个程序:如io 二、了解协程的过程 1、yield工作原理 从语法上来看,协程和生成器类似,都是定义体中包含yield关键字的函数。 yield在协程中的用法: 在协程中yield通常出现在表达式的右边,例如:datum = yield,可以产出值,也可以不产出--如果yield关键字后面没有表达式,那么生成器产出None。 在协程中yield也可能从调用方接受数据,调用方是通过send(datum)的方式把数据提供给协程使用,而不是next(...

协程

僤鯓⒐⒋嵵緔 提交于 2019-12-02 07:02:22
协程:非抢占式,由代码控制切换,非操作系统强制控制切换 生成器: def f():   print("ok")   s=yield 6 用于保存并返回当前的执行状态。   print(s)   print("ok2")   yield gen=f() 函数中加上yield再执行函数,就变成了一个生成器对象,对于生成器,必须调用next()函数才能执行生成器里面的内容,单纯 f()不执行里面的内容,因为此时已经不是一个函数了,变成了生成器,必须调用next()函数 print(gent) ---> <generator object f at 0x000000000000....>,这里返回的是一个生成器的对象 res=next(gen) 这里是生成器对象开始执行,遇到yield就停止,返回yield的值,print(yield)-->返回yield后面的6 程序执行代码 next(gen) 运行结果就是 print("ok") next()方法让让生成器往下执行了一步,打印出了ok gen.send(5) #send()方法 ,也可以跟生成器进行交互 将5赋值给第一个yield, 此时print(s)----->打印的值是5 协程 (coroutine),又叫微线程:l0 def consumer(name):   print("------>ready to eat baozi"

(day31) Event+协程+进程/线程池

点点圈 提交于 2019-12-02 07:00:55
目录 昨日回顾 GIL全局解释器锁 计算密集型和IO密集型 死锁现象 递归锁 信号量 线程队列 FOFI队列 LIFO队列 优先级队列 今日内容 Event事件 线程池与进程池 异步提交和回调函数 协程 yiled gevent模块 昨日回顾 GIL全局解释器锁 本质上是互斥锁 Cpython才有的 同一个进程下开启多个线程,让并发变成串行,保证线程安全 计算密集型和IO密集型 计算密集型 使用多进程 IO密集型 使用多线程 死锁现象 两个锁在两个或多个线程或进程中被相互调用,从而陷入相互等待的现象 递归锁 解决死锁问题,相当于串在一起的锁,只有在递归锁的引用计数为0 ,才能被使用 信号量 相当于锁店,设置多少个就能被多少个线程或进程使用 线程队列 FOFI队列 先进先出 LIFO队列 后进先出 优先级队列 按照从左到右,根据数字/acsii大小,越小,优先级越高 今日内容 Event事件 控制线程的执行,由一些线程去控制另一些线程 当Event对象为False时,该线程会被阻塞,直至Event对象为真,相当于红绿灯的作用 isSet():返回Event对象的状态 wait():判断Event对象的状态,若为Flase,则阻塞 Set():设置Event对象为Ture clear():恢复Event对象为False from threading import Event from

day 31协程

▼魔方 西西 提交于 2019-12-02 06:57:47
Event事件 作用:用来控制线程的执行,由一些线程去控制另一些线程。 from threading import Event from threading import Thread import time #调用Event类实例化一个对象 e=Event() #若是该方法出现在任务中,则为False,阻塞 # e.wait()#False #若该方法出现在任务中,则将其他线程的False改为True,进入就绪态与运行态 # e.set()#True def light(): print('红灯亮...') time.sleep(5) #应该开始发送信号,告诉其他线程准备执行 e.set()#将car中的False变成True print('绿灯亮') def car(name): print(f'{name}正在等待红灯。。。') #让所有汽车任务进入阻塞态 e.wait()#False print(f'{name}开始飘逸') #让一个light线程任务,控制多个car线程任务 t=Thread(target=light) t.start() for line in range(10): t=Thread(target=car,args=(f'童子军坦克{line}号',)) t.start() '''红灯亮... 童子军坦克0号正在等待红灯。。。 童子军坦克1号正在等待红灯

day 31 小结

给你一囗甜甜゛ 提交于 2019-12-02 06:49:26
目录 Event事件 进程池与线程池 协程 gevent实现协程 TCP服务端实现协程 IO模型 Event事件 ​ 作用: 用来控制线程的执行 ​ 由一些线程去控制另一些线程 from threading import Event from threading import Thread import time # 调用Event类实例化一个对象 e = Event() # 若该方法出现在任务中,则为False,阻塞 # e.wait() # False # 若该方法出现在任务中,则将其他线程的Flase改为True,进入就绪态与运行态 # e.set() # True def light(): print('红灯亮...') time.sleep(5) # 应该开始发送信号,告诉其他线程准备执行 e.set() # 将car中的False ---> True print('绿灯亮...') def car(name): print('正在等红灯....') # 让所有汽车任务进入阻塞态 e.wait() # False print(f'{name}正在加速漂移....') # 让一个light线程任务 控制多个car线程任务 t = Thread(target=light) t.start() for line in range(10): t = Thread(target