【1】
假设我们的计算机只有一个单核的处理器,然后同时被分配了几个任务,那么它就不得不在各个任务中来回切换,短暂地执行其中一个任务,然后中断,然后短暂地执行下一个任务,以保持所有的进程都在运行。这就像一个厨师在做面条,切几秒钟菜,跑去揉几下面,再赶紧查看下汤。
所以同时需要完成的任务越多,同时跟踪所有的任务就越困难。这就是多进程的必要性,也是多核处理器的威力所在。
一个支持多进程的操作系统可以做到:
- 同时指挥多个CPU,即拥有一个以上的CPU的计算机
- 指挥多核CPU,即拥有两个及以上的独立处理单元的CPU
这样,计算机就可以轻松地同时执行多个任务,每个任务都可以使用自己的处理器。就像之前举的例子,现在厨房里有专门的揉面师傅,备菜师傅,煮汤师傅。事情就变得轻松多了。
【2】
multiprocessing
multiprocessing模块支持使用类似于threading模块的API生成进程。multiprocessing模块提供了本地和远程计算机的并行处理能力,并且通过使用创建子进程,有效地避开了全局解释器锁(GIL)。因此,multiprocessing模块允许程序员充分利用机器上的多个处理器。目前,它可以在Unix和Windows上运行。
importing the multiprocessing module
import multiprocessing
def print_cube(num):
print("Cube: {}".format(num * num * num))
def print_square(num):
print("Square: {}".format(num * num))
if __name__ == "__main__":
# creating processes
p1 = multiprocessing.Process(target=print_square, args=(10, ))
p2 = multiprocessing.Process(target=print_cube, args=(10, ))
# starting process 1&2
p1.start()
p2.start()
# wait until process 1&2 is finished
p1.join()
p2.join()
# both processes finished
print("Done!")
start()
方法就是开始执行p1,p2两个进程。在进程开始执行后,主程序仍然会继续执行。为了让主程序暂停,我们就使用了join()
方法。它的作用就是将主程序暂停,直到等待p1和p2完成。一旦它们都完成了,再执行之后的语句。
多进程,不等于多核cpu。只有多核cpu才能够多进程是错误说法
可实际上cpu核数和多进程没有必然联系。单核cpu也可以处理多进程。进程只是更高级的线程,可以理解成对线程的包装和组合。cpu在处理线程和进程时,都是用切换来实现。只是多核就不用切换频繁,效率更高。
【3】multiprocessing 一些参数:
构造方法:
Process([group [, target [, name [, args [, kwargs]]]]])
group: 线程组
target: 要执行的方法
name: 进程名
args/kwargs: 要传入方法的参数
实例方法:
is_alive():返回进程是否在运行,bool类型。
join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。
start():进程准备就绪,等待CPU调度
run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。
terminate():不管任务是否完成,立即停止工作进程
属性:
daemon:和线程的setDeamon功能一样
name:进程名字
pid:进程号
【4】代码:
自己随便写的,可以运行!
先学到这:) 之后用到的时候,遇到问题继续写:):)