协程

Go_CSP并发模型

安稳与你 提交于 2020-02-03 07:39:36
go语言的最大两个亮点,一个是goroutine,一个就是chan了。二者合体的典型应用CSP,基本就是大家认可的并行开发神器,简化了并行程序的开发难度,我们来看一下CSP。 11.1、CSP是什么 CSP 是 Communicating Sequential Process 的简称,中文可以叫做通信顺序进程,是一种并发编程模型,是一个很强大的并发数据模型,是上个世纪七十年代提出的,用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。相对于Actor模型,CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。 严格来说,CSP 是一门形式语言(类似于 ℷ calculus),用于描述并发系统中的互动模式,也因此成为一众面向并发的编程语言的理论源头,并衍生出了 Occam/Limbo/Golang… 而具体到编程语言,如 Golang,其实只用到了 CSP 的很小一部分,即理论中的 Process/Channel(对应到语言中的 goroutine/channel):这两个并发原语之间没有从属关系, Process 可以订阅任意个 Channel,Channel 也并不关心是哪个 Process 在利用它进行通信;Process 围绕 Channel 进行读写,形成一套有序阻塞和可预测的并发模型。 11.2

python-多任务之协程

痴心易碎 提交于 2020-02-03 00:51:00
迭代的概念 使用for循环遍历取值的过程叫做迭代,比如:使用for循环遍历列表获取值的过程 # 例如 for value in [ 2 , 3 , 4 ] : print ( value ) 可迭代对象 使用for循环遍历取值的对象叫做可迭代对象, 比如:列表、元组、字典、集合、range、字符串 如何判断是否为可迭代对象 # 元组,列表,字典,字符串,集合,range都是可迭代对象 from collections . abc import Iterable # 3.7以上版本为导入collections.abc # from collections import Iterable # 判断对象是否是指定类型 result = isinstance ( ( 3 , 5 ) , Iterable ) print ( "元组是否是可迭代对象:" , result ) result = isinstance ( [ 3 , 5 ] , Iterable ) print ( "列表是否是可迭代对象:" , result ) result = isinstance ( { "name" : "张三" } , Iterable ) print ( "字典是否是可迭代对象:" , result ) result = isinstance ( "hello" , Iterable ) print

理解Go协程与并发

瘦欲@ 提交于 2020-02-01 20:15:58
协程 Go语言里创建一个协程很简单,使用 go 关键字就可以让一个普通方法协程化: package main import ( "fmt" "time" ) func main(){ fmt.Println("run in main coroutine.") for i:=0; i<10; i++ { go func(i int) { fmt.Printf("run in child coroutine %d.\n", i) }(i) } //防止子协程还没有结束主协程就退出了 time.Sleep(time.Second * 1) } 下面这些概念可能不太好理解,需要慢慢理解。可以先跳过,回头再来看。 概念: 协程 可以理解为纯用户态的线程,其通过协作而不是抢占来进行切换。相对于进程或者线程,协程所有的操作都可以在用户态完成,创建和切换的消耗更低。 一个进程内部可以运行多个线程,而每个线程又可以运行很多协程。线程要负责对协程进行调度,保证每个协程都有机会得到执行。当一个协程睡眠时,它要将线程的运行权让给其它的协程来运行,而不能持续霸占这个线程。同一个线程内部最多只会有一个协程正在运行。 协程可以简化为三个状态: 运行态 、 就绪态 和 休眠态 。同一个线程中最多只会存在一个处于运行态的协程。 就绪态协程 是指那些具备了运行能力但是还没有得到运行机会的协程,它们随时会被调度到运行态

Python3 异步协程基础

不羁岁月 提交于 2020-01-31 00:18:51
这里的异步是指“不等待IO执行结果” 协程 1、 什么是协程 :协程是线程的更小切分,又称为“微线程”,是一种用户态的轻量级线程。 2、 协程的优缺点 : 优点: 无需线程上下文切换的开销,协程避免了无意义的调度,由此可以提高性能(但也因此,程序员必须自己承担调度的责任,同时,协程也失去了标准线程使用多CPU的能力) 无需原子操作锁定及同步的开销 方便切换控制流,简化编程模型 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。 缺点: 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上.当然我们日常所编写的绝大部分应用都没有这个必要,除非是cpu密集型应用。 进行阻塞(Blocking)操作(如IO时)会阻塞掉整个程序 相关了解: event_loop:事件循环,相当于一个无限循环,可以挂起一些函数,当满足条件时,函数可以被循环执行 coroutine:协程对象 task:任务 future:代表将来或还没有执行的任务,也相当于一个task async:定义了一个协程 await:用来挂起阻塞方法 基本操作: 导入asyncio模块:import asyncio async关键字:使用此关键字返回一个协程对象 async def coroutine ( ) : print (

生成器

流过昼夜 提交于 2020-01-30 12:36:44
生成器 一、yield关键字(生成器) yield的英文单词意思是生产,在函数中但凡出现yield关键字,再调用函数,就不会继续执行函数体代码,而是会返回一个值。 def func(): print(1) yield print(2) yield g = func() print(g) <generator object func at 0x10ddb6b48> 生成器的本质就是迭代器,同时也并不仅仅是迭代器,不过迭代器之外的用途实在是不多,所以我们可以大声地说:生成器提供了非常方便的自定义迭代器的途径。并且从Python 2.5+开始,[PEP 342:通过增强生成器实现协同程序]的实现为生成器加入了更多的特性,这意味着生成器还可以完成更多的工作。这部分我们会在稍后的部分介绍。 def func(): print('from func 1') yield 'a' print('from func 2') yield 'b' g = func() print(g) print(g.__iter__()) # 迭代器 print(F"g.__iter__ == g: {g.__iter__() == g}") res1 = g.__next__() print(f"res1: {res1}") res2 = next(g) print(f"res2: {res2}")

Tornado 协程

∥☆過路亽.° 提交于 2020-01-30 00:42:51
同步异步I/O客户端 from tornado.httpclient import HTTPClient,AsyncHTTPClient def ssync_visit(): http_client = HTTPClient() response = http_client.fetch('www.baidu.com') # 阻塞,直到网站请求完成 print(response.body) def hendle_response(response): print(response.body) def async_visit(): http_client = AsyncHTTPClient() http_client.fetch('www.baidu.com',callback=hendle_response) # 非阻塞 async_visit() 协程 1、编写协程函数 from tornado import gen # 引入协程库 from tornado.httpclient import AsyncHTTPClient @gen.coroutine def coroutine_visit(): http_client = AsyncHTTPClient() response = yield http_client.fetch('www.baidu.com') print

最新Python异步编程详解

久未见 提交于 2020-01-29 09:00:20
我们都知道对于I/O相关的程序来说,异步编程可以大幅度的提高系统的吞吐量,因为在某个I/O操作的读写过程中,系统可以先去处理其它的操作(通常是其它的I/O操作),那么Python中是如何实现异步编程的呢? 简单的回答是Python通过协程(coroutine)来实现异步编程。那究竟啥是协程呢?这将是一个很长的故事。 故事要从yield开始说起(已经熟悉yield的读者可以跳过这一节)。 yield yield是用来生成一个生成器的(Generator), 生成器又是什么呢?这又是一个长长的story,所以这次我建议您移步到这里: 完全理解Python迭代对象、迭代器、生成器 ,而关于yield是怎么回事,建议看这里: [翻译]PYTHON中YIELD的解释 好了,现在假设你已经明白了yield和generator的概念了,请原谅我这种不负责任的说法但是这真的是一个很长的story啊! 总的来说,yield相当于return,它将相应的值返回给调用next()或者send()的调用者,从而交出了cpu使用权,而当调用者再调用next()或者send()时,又会返回到yield中断的地方,如果send有参数,又会将参数返回给yield赋值的变量,如果没有就跟next()一样赋值为None。但是这里会遇到一个问题,就是嵌套使用generator时外层的generator需要写大量代码

GO语言实战八 并发相关概念

五迷三道 提交于 2020-01-29 04:03:23
go并发简介 Go 语言里的并发指的是能让某个函数独立于其他函数运行的能力。当一个函数创建为 goroutine 时,Go 会将其视为一个独立的工作单元。这个单元会被调度到可用的逻辑处理器上执行。Go 语言 运行时的调度器是一个复杂的软件,能管理被创建的所有 goroutine 并为其分配执行时间。这个调度 器在操作系统之上,将操作系统的线程与语言运行时的逻辑处理器绑定,并在逻辑处理器上运行 goroutine。调度器在任何给定的时间,都会全面控制哪个 goroutine 要在哪个逻辑处理器上运行。 Go 语言的并发同步模型来自一个叫作 通信顺序进程 (Communicating Sequential Processes,CSP) 的范型(paradigm)。CSP 是一种消息传递模型,通过在 goroutine 之间传递数据来传递消息,而不是 对数据进行加锁来实现同步访问。用于在 goroutine 之间同步和传递数据的关键数据类型叫作通道(channel)。 一些概念 进程 狭义的定义:进程就是一段程序的执行过程。 广义定义:进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元。 简单来讲进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data

python之greenlet实现协程

不羁岁月 提交于 2020-01-29 03:49:57
greenlet+switch机制来实现协程 greenlet用于创建协程,switch用于进行协程之间的切换某个协程在执行的过程中可以随时的被其他协程通过switch函数来打断,转而去执行其他协程,当前协程的中断现场会被保留,一旦中断的协程再次获得cpu的执行权首先会恢复现场然后从中断处继续执行 这种机制下的协程是同步,不能并发: from greenlet import greenlet from time import sleep def func1 ( ) : print ( "协程1" ) sleep ( 2 ) g2 . switch ( ) print ( "协程1恢复运行" ) def func2 ( ) : print ( "协程2" ) sleep ( 1 ) g3 . switch ( ) def func3 ( ) : print ( "协程3" ) sleep ( 1 ) g1 . switch ( ) if __name__ == '__main__' : # 使用greenlet来创建三个协程 g1 = greenlet ( func1 ) g2 = greenlet ( func2 ) g3 = greenlet ( func3 ) # print(g1) g1 . switch ( ) # 让协程g1取抢占cpu资源 ''' 协程1 协程2 协程3

Python进程、线程、协程之间的关系

喜你入骨 提交于 2020-01-28 15:22:27
一、从操作系统角度 操作系统处理任务, 调度单位是 进程 和 线程 。 1.进程: 表示一个程序的执行活动 (打开程序、读写程序数据、关闭程序) 2.线程: 执行某个程序时, 该进程调度的最小执行单位 (执行功能1,执行功能2) 一个程序至少有一个进程 一个进程至少有一个线程 1.并行: 需要处理的任务数 == CPU核心数量 两个任务 两个核心 任务1:------------- 任务2:------------- 2.并发: 需要处理的任务数 > CPU核心数量 三个任务 一个核心 任务1: ----- ------ 任务2: ------ 任务3: ------ 二、从程序角度 多进程和多线程 表示:当前程序可以同时执行多个任务 进程和线程都是由 操作系统调度完成 1.进程:    每个进程都是有自己独立的内存空间,不同进程之间的内存空间是不能共享。 不同进程之间的通信是由操作系统来完成的。 不同进程之间的通信效率低切换开销也大。 2.线程:   一个进程下可以有多个线程,同一个进程内的线程可以共享内存空间. 不同线程之间的通信 有进程 管理。 不同线程之间的通信效率高,切换开销小。 3.互斥锁:   共享意味着多个线程的竞争 会导致不安全问题。 为了保护内存空间的数据不被多个线程同时读写, 导致数据隐患, 于是诞生了" 互斥锁 "。 "互斥锁":