协程

Python连载38-协程、可迭代、迭代器、生产者消费者模型

末鹿安然 提交于 2019-11-30 02:21:30
一、生产者消费者模型 import multiprocessing from time import ctime def consumer(input_q): print("Into consumer:",ctime()) while True: #处理项 item = input_q.get() print("pull",item,"out of q")#此处替换为有用的工作 input_q.task_done()#发出信号通知任务完成 print("Out of consumer:",ctime()) #此句未执行,因为q.join()收集到四个task_done()信号后,主进程启动 def producer(sequence,output_q): print("Into producer:",ctime()) for item in sequence: output_q.put(item) print("put",item,"into_q") print("Out of producer:",ctime()) #建立进程 if __name__ == "__main__": q=multiprocessing.JoinableQueue() #运行消费者进程 cons_p = multiprocessing.Process(target=consumer,args=(q,)

Coroutine 协程

核能气质少年 提交于 2019-11-30 00:30:57
https://en.wikipedia.org/wiki/Coroutine Coroutines are computer program components that generalize subroutines for non-preemptive multitasking , by allowing execution to be suspended and resumed. Coroutines are well-suited for implementing familiar program components such as cooperative tasks , exceptions , event loops , iterators , infinite lists and pipes . According to Donald Knuth , Melvin Conway coined the term coroutine in 1958 when he applied it to construction of an assembly program . [1] The first published explanation of the coroutine appeared later, in 1963. [2] 协程 是计算机程序的一类组件,推广了

golang协程

依然范特西╮ 提交于 2019-11-30 00:03:00
/* go 并行功能 goroutine是一个轻量级的线程 */ package main import ( "fmt" ) func f(from string) { for i := 0; i < 3; i++ { fmt.Println(i) } } /* 知识点: go 函数 go func(){}() fmt.Scanln() //等待终端输入 */ func main() { f("direct") go f("goroutine") go func(msg string){ fmt.Println(msg) }("going") var input string fmt.Scanln(&input) fmt.Println("done") } 来源: https://blog.csdn.net/boshuzhang/article/details/100976715

一文读懂什么是进程、线程、协程

隐身守侯 提交于 2019-11-29 19:11:59
目录 进程 线程 任务调度 进程与线程的区别 多线程与多核 一对一模型 多对一模型 多对多模型 查看进程与线程 线程的生命周期 协程 协程的目的 协程的特点 协程的原理 协程和线程的比较 进程   我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序则是具有某种功能的程序,程序是运行于操作系统之上的。   进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。 进程一般由程序、数据集合和进程控制块三部分组成。 程序用于描述进程要完成的功能,是控制进程执行的指令集; 数据集合是程序在执行时所需要的数据和工作区; 程序控制块(Program Control Block,简称PCB),包含进程的描述信息和控制信息,是进程存在的唯一标志。 进程具有的特征: 动态性:进程是程序的一次执行过程,是临时的,有生命期的,是动态产生,动态消亡的; 并发性:任何进程都可以同其他进程一起并发执行; 独立性:进程是系统进行资源分配和调度的一个独立单位; 结构性:进程由程序、数据和进程控制块三部分组成。 线程   在早期的操作系统中并没有线程的概念,进程是能拥有资源和独立运行的最小单位

go chan 缓存与阻塞

故事扮演 提交于 2019-11-29 18:57:25
原文链接: Go语言第十一课 并发(三)Channel缓存与阻塞 Channel的缓存 前面介绍过channel的创建方法: channel_test := make(chan string) 其实它完整的写法应该是: channel_test := make(chan string,0) 这种容量为0的channel就是无缓存channel。对应地,我们也可以创建有缓存channel channel_test := make(chan string,1) 无缓存channel channel是否有缓存最根本的不同是阻塞策略的不同。 无缓存的channel会在读写两端产生阻塞即: 当对一个无缓存的channel读时,若数据尚未到达,则读协程阻塞;当对一个无缓存的channel写时,若数据尚未消费,则写协程阻塞。 基于此,无缓存的channel也成为同步channel 需要特别注意的是,当数据尚未被消费时,接收者接收数据发生在唤醒发送者协程之前! 有缓存channel 带缓存的channel实际上是一个阻塞队列。对队列的写总发生在队尾,队列满时写协程阻塞;对队列的读总发生在队尾,队列空时读协程阻塞。 内置函数cap(channel)可以读取队列的总长度。 内置队列len(channel)可以读取队列的有效长度(已使用长度)。 有缓存的channel的最大意义在于生产和消费可以解耦。

python之协程

醉酒当歌 提交于 2019-11-29 16:38:08
一、协程理论 1.1 协程产生的背景 之前我们学习了线程、进程的概念,了解了在操作系统中 进程是资源分配的最小单位,线程是CPU执行的最小单位。 随着我们对于效率的追求不断提高, 基于单线程来实现并发 又成为一个新的课题,即只用一个主线程(很明显可利用的cpu只有一个)情况下实现并发。这样就可以节省创建线进程所消耗的时间。 本节我们就基于单线程来实现并发,首先我们要回顾一下并发的本质: 切换+保存状态 cpu正在运行一个任务,会在两种情况下切走去执行其他的任务(切换由操作系统强制控制) (1)该任务发生了阻塞 (2)该任务计算时间过长或有个更高级的程序替代它 ps:在介绍进程理论时,提及进程的三种执行状态,而线程才是执行单位,所以也可以将上图理解为线程的三种状态 注意点1 第二种情况本质上并不能提高效率,只是为了cpu能雨露均沾,实现看起来所有任务被“同时”执行,如果多个任务是纯计算的,单纯的切换反而会降低效率。 1.2 yield实现并发 我们通过yield验证,yield本身就是一种在单线程下可以保存任务运行状态的方法,我们来简单复习一下: #1 yiled可以保存状态,yield的状态保存与操作系统的保存线程状态很像,但是yield是代码级别控制的,更轻量级 #2 send可以把一个函数的结果传给另外一个函数,以此实现单线程内程序之间的切换 yield实现并发的缺点: (1

并发编程总结

谁都会走 提交于 2019-11-29 13:52:24
并发方面 总结:(需要掌握) 网络编程 网络基础 网卡 IP ... OSI七层 三次握手四次握手 BS架构和CS架构 socket代码 粘包现象 断点续传 协议 {'code':'101023',....} HTTP协议: /s?wd=alex HTTP/1.0\r\nhost:www.baidu.com\r\n\r\n 面向对象 +高级作业(FTP作业):反射/面向对象 并发编程 进程;线程;协程的区别 线程 基本写法 实例化 继承方法 锁(Rlock) 线程池 进程 基本写法 实例化 继承方法 锁(Rlock) 进程池 进程池数据共享 协程 协程 协程+IO:gevent IO多路复用 异步/同步 阻塞/非阻塞 来源: https://www.cnblogs.com/Hybb/p/11518901.html

Python 协程

白昼怎懂夜的黑 提交于 2019-11-29 13:51:07
协程 进程 :操作系统中存在 线程 :操作系统中存在 协程 :是微线程 模块(greenlet) 协程不是一个真实存在的东西,是由程序员创造出来的 协程,是对一个线程分片,使得线程在代码块之间进行来回切换,而不是原来逐步执行。 单纯的协程是无用的,有时候而且会降低性能 示例代码: import greenlet def f1(): print(11) gr2.switch() print(22) gr2.switch() def f2(): print(33) gr1.switch() print(44) # 创建两个协程 gr1 = greenlet.greenlet(f1) gr2 = greenlet.greenlet(f2) gr1.switch() 协程存在的意义 单线程实现并发:如果遇到 IO操作 就会进行切换 遇到IO就切换 + 协程 == 牛逼起来了。。。 遇到IO就切换 实现: gevent模块 gevent模块(IO切换+协程) 安装: pip install gevent 示例代码: ########### 协程+IO切换 from gevent import monkey monkey.patch_all() # 以后代码中遇到IO就会执行greenlet的switch进行切换 import requests import gevent def get

多线程、多进程、协程爬虫

落爺英雄遲暮 提交于 2019-11-29 13:31:58
多线程、多进程、协程爬虫 对于操作系统来说,一个任务就是个进程(Process) ,比如打开 个vs code就是启动个vs code进程,打开一个vim就启动了 一个vim进程,打开vim就启动了vim进程,打开个Word就启动了个Word进程。 有些进程还不止同时干件事,比如word 它可以同时进行打字、 拼写检查、打印等事情。在一个进程内部, 要同时干多件事,就需要 同时运行多个“子任务”,我们把进程内的这些“子任务”称为线程(Thread). 进程、线程、协程的区别 多进程模式最大的优点就是稳定性高,因为一个子进程崩溃了,不会影响主进程和其他子进程。(当然主 进程挂了所有进程就全挂了,但 是Master进程只负责分配任务,挂掉的概率低,蓍名的Apache最早就是采用多进程模式。 来源: https://blog.csdn.net/qq_41228218/article/details/100823135

线程,进程,协程

我们两清 提交于 2019-11-29 10:30:18
python 线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元。 1、threading模块 threading 模块建立在 _thread 模块之上。thread 模块以低级、原始的方式来处理和控制线程,而 threading 模块通过对 thread 进行二次封装,提供了更方便的 api 来处理线程。 import threading import time def worker(num): """ thread worker function :return: """ time.sleep(1) print("The num is %d" % num) return for i in range(20): t = threading.Thread(target=worker,args=(i,),name=“t.%d” % i) t.start() 上述代码创建了20个“前台”线程,然后控制器就交给了CPU,CPU根据指定算法进行调度,分片执行指令。 Thread方法说明 t.start() : 激活线程, t.getName() : 获取线程的名称 t.setName() : 设置线程的名称 t.name : 获取或设置线程的名称 t.is_alive() : 判断线程是否为激活状态 t.isAlive() :判断线程是否为激活状态 t