python高斯窗函数的简单介绍( 二 )


现在 , 多核CPU已经非常普及了,但是,即使过去的单核CPU , 也可以执行多任务 。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢?
答案就是操作系统轮流让各个任务交替执行,任务1执行0.01秒 , 切换到任务2,任务2执行0.01秒,再切换到任务3,执行0.01秒,这样反复执行下去 。表面上看,每个任务都是交替执行的,但是,由于CPU的执行速度实在是太快了,我们感觉就像所有任务都在同时执行一样 。
真正的并行执行多任务只能在多核CPU上实现,但是 , 由于任务数量远远多于CPU的核心数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行 。其实就是CPU执行速度太快啦!以至于我们感受不到在轮流调度 。
并行与并发
并行(Parallelism)
并行:指两个或两个以上事件(或线程)在同一时刻发生,是真正意义上的不同事件或线程在同一时刻,在不同CPU资源呢上(多核),同时执行 。
特点
并发(Concurrency)
指一个物理CPU(也可以多个物理CPU) 在若干道程序(或线程)之间多路复用,并发性是对有限物理资源强制行使多用户共享以提高效率 。
特点
multiprocess.Process模块
process模块是一个创建进程的模块 , 借助这个模块,就可以完成进程的创建 。
语法:Process([group [, target [, name [, args [, kwargs]]]]])
由该类实例化得到的对象 , 表示一个子进程中的任务(尚未启动) 。
注意:1. 必须使用关键字方式来指定参数;2. args指定的为传给target函数的位置参数,是一个元祖形式,必须有逗号 。
参数介绍:
group:参数未使用,默认值为None 。
target:表示调用对象,即子进程要执行的任务 。
args:表示调用的位置参数元祖 。
kwargs:表示调用对象的字典 。如kwargs = {'name':Jack, 'age':18} 。
name:子进程名称 。
代码:
除了上面这些开启进程的方法之外,还有一种以继承Process的方式开启进程的方式:
通过上面的研究 , 我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序 , 一旦开启也不受我们控制 。尽管并发编程让我们能更加充分的利用IO资源,但是也给我们带来了新的问题 。
当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题,我们可以考虑加锁,我们以模拟抢票为例,来看看数据安全的重要性 。
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改 。加锁牺牲了速度,但是却保证了数据的安全 。
因此我们最好找寻一种解决方案能够兼顾:1、效率高(多个进程共享一块内存的数据)2、帮我们处理好锁问题 。
mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道 。队列和管道都是将数据存放于内存中 队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,我们应该尽量避免使用共享数据 , 尽可能使用消息传递和队列,避免处理复杂的同步和锁问题 , 而且在进程数目增多时,往往可以获得更好的可获展性(后续扩展该内容) 。
线程
Python的threading模块
Python 供了几个用于多线程编程的模块 , 包括 thread, threading 和 Queue 等 。thread 和 threading 模块允许程序员创建和管理线程 。thread 模块 供了基本的线程和锁的支持,而 threading 供了更高级别,功能更强的线程管理的功能 。Queue 模块允许用户创建一个可以用于多个线程之间 共享数据的队列数据结构 。

推荐阅读