1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 一则故事表达:并发 并行 同步 异步 线程 多线程

一则故事表达:并发 并行 同步 异步 线程 多线程

时间:2018-10-17 05:51:44

相关推荐

一则故事表达:并发 并行 同步 异步 线程 多线程

一个小事件说明下并发,并行,同步,异步,线程,多线程

一个广交会举办向8间公司发起展览邀请,参展公司有8间,场地有80万平方米的展示区域,每个参展商有10万平方米可以用于展出售卖,每个参展公司仅仅配备1个员工,每个货架之间都有距离,员工在销售时需要去到货架前面,每个货架仅能放一种商品。

8间公司的摊位:多进程8间公司都在售卖中:并行第1间公司有1个货架,货架有1个商品:1线程第2间公司有20个货架,每个货架有1个商品:20线程第3间公司有1个货架,货架配置100件商品:单线程并发(异步)第4间公司有没有货架,卖的【按摩服务】。第5间公司与第6间公司是同一个母公司,名为A公司,也就意味着A公司有2个摊位:并行

对应理解

【并发】:广交会举办向8间公司发起展览邀请,分先后,先发邀请函给我之后再发给你......一共发了8个邀请【多进程】:8间公司的都有自己的摊位【并行】:8间公司同时进行着展示任务,每一间公司都有属于自己的摊位,不用和别人轮流共用一个摊位【线程】:货架的数量【计算密集型】:第1间参展公司有1个货架配置1个商品,卖的是大型商品【大核弹头】,需要详细讲解使用方法才能使用的商品。【处理I/O密集型】:第3间公司有1个货架,配置100件商品,卖的是小型商品【纯净水】,直接收钱交货,讲解的内容少。【同步】:第4间公司,卖的是【按摩服务】:需要从头按到脚。【不能更改按摩顺序】【异步】【单线程并发】:第3间公司有1个货架,货架配置100件商品:员工仅需在一个货架前卖该货架上的100件商品,1件1件地卖【并发属于并行的特殊类型】【并发并不意味着并行】:一个货架展示100种商品不等于有两个摊位【第3间公司有1个货架,货架配置100件商品:单线程并发(异步)-----第5间公司与第6间公司是同一个母公司,名为A公司,也就意味着A公司有2个摊位】----【单核CPU是不能够实现并行】【并发并不意味着并行】:第1间公司先参加的的展示,第2间公司还在报名填表中

多核处理器中一般为1个进程对应1个核心

【单核心并发】多进程在单核CPU中运行,即理解为:一个展会场地有10万平方,每间公司的展示都需要10万平方的,但是这里有8间公司,他们不能同时展出,那么他们将在该场地上轮流展出(而且被要求每隔多少秒就要换一间公司)。所以需要更长的时间才能完成本次展出任务。(cpu上是每隔0.00N毫秒快速切换,让你感觉不出它再切换)【单核CPU是不能实现并行】

异步IO,asyncio库是一种并发编程设计,从Python 3.4版本才引入

异步IO适用在哪里?

异步IO (async IO):一种与语言无关的范例(模型),由多种编程语言实现

async/ await: 用于定义协程的关键字asyncio/异步io库:为运行和管理协程提供了基础和API Python中异步IO的核心:协程(专用的生成器函数)async IO:异步ioasyncio:python中的异步库

需要Python 3.7或更高版才能执行以下操作

升级:

pip install --upgrade pip aiohttp aiofiles或者python3 -m pip install --upgrade pip aiohttp aiofiles

并行:同时执行多个操作多进程:实现并行的一种方法多进程:善于处理计算密集型(CPU-bound)任务:强密集循环和数学计算并发:多个任务重叠方式运行。【并发属于并行的特殊类型】线程:并发执行模型。多个线程轮流执行任务,一个进程可以包含多个线程。线程:善于处理I/O密集型任务。因为I/O需要等待。并发属于并行的特殊类型并发包括多进程和线程————【计算密集】+【I/O密集】多进程是并行的一种表现形式。

Python对【并行】【并发】两种形式都提供了长期的支持

【通过它的标准库包 multiprocessing,threading 和 concurrent.futures】

CPython构建了一个独立的设计:asyncio库。

异步IO,把 asyncio 包添加至标准库。

关键字【async】和【await】。

async IO 不是新发明的概念

async IO 已经存在其他语言及运行时环境中,如 Go,C# 和 Scala 等。

Python文档把 asyncio 包称为【一个编写并发代码的库】。

async IO【异步IO】 不是【线程】与【多进程】。async IO【异步IO】 在单进程中使用单线程运行,是一种单进程、单线程的设计【只是使用协同多任务处理机制】。协程(async IO的核心功能)可以被同时调度,但它本身并不是并发。虽然给人一种并发的感觉。异步的属性:异步例程能够在等待其最终结果时“暂停”,并允许其他的例程同时运行。

concurrency并发【Threading多线程,AsyncIO异步I/O】Parallelism并行【Multiprocessing多进程】

案例对比

异步版本

import asyncioasync def count():print("One")await asyncio.sleep(1)print("Two")async def main():await asyncio.gather(count(), count(), count())if __name__ == "__main__":import times = time.perf_counter()asyncio.run(main())elapsed = time.perf_counter() - sprint(f"{__file__} executed in {elapsed:0.2f} seconds.")

输出结果为:

OneOneOneTwoTwoTwo{文件路径+文件名} executed in 1.00 seconds.

这个输出的顺序是异步IO的核心,

由单一事件循环或协调器负责与每一个 count() 方法调用交流。

当每一个任务执行到 await asyncio.sleep(1))时,

该函数会告知【事件循环】并交出控制权限,

“我要休眠一秒钟,在此期间,继续做其它的事”。

同步版本:

import timedef count():print("One")time.sleep(1)print("Two")def main():for _ in range(3):count()if __name__ == "__main__":s = time.perf_counter()main()elapsed = time.perf_counter() - sprint(f"{__file__} executed in {elapsed:0.2f} seconds.")

在输出顺序和时间上有变化

OneTwoOneTwoOneTwocountsync.py executed in 3.01 seconds.

上面两个案例

使用 time.sleep() 和 asyncio.sleep() 看起来有点简陋,这里一般用来替代标准输入等耗时的操作。

asyncio里面的语法 async def

引入了原生协程或者说异步生成器。

表达式async withasync for

例子:

async def g():r = await f()return r

g()函数里面有一个f()函数

关键字 await 将控制器传递给事件循环。(即挂起当前运行的协程)Python执行时,在 g() 函数内如果遇到表达式 await f(),await 会告诉事件循环,“先暂停 g() 函数,等 f()函数 返回结果,并且在此期间,可以运行其它函数。”

使用 await 与 return 的组合创建协程函数。想要调用一个协程函数,须使用 await 等待返回结果。

案例1

async def f(x):y = await z(x) return y

上面代码可以执行`await`和`return`在协程中允许

案例2

def m(x):y = await z(x)

#上面代码语法错误:这里没有“`async def`”

案例3

async def g(x):yield x

#上面代码可以执行:这是一个异步生成器#但是在 async def 代码块中使用 yield 的不多见

案例4

async def m(x):yield from gen(x)

#语法错误: SyntaxError#在 async def 定义的地方都不用 yield from,这会引发异常 SyntaxError。

展示案例:1成器的方式——2.原生协程

import asyncio#1.基于生成器的方式@asyncio.coroutinedef py34_coro():yield from stuff()#2.原生协程async def py35_coro():await stuff()

Python 3.5中出现了async/await 语法后,async/await 取代了生成器的协程方式。

生成器的协程方式属于过时了。

最好是使用原生协程。

基于生成器的协程将会在Python 3.10版本移除。

注意

使用 async/await 语法(await 不能用于基于生成器的协程),这些规则很大程度上与基于生成器的协程不兼容。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。