引子
进程
线程(优先阅读)
协程
进程
概念:就是一个程序在一个数据集上的一次动态执行过程(本质上来讲,就是运行中的程序(代指运行过程),程序不运行就不是进程) 抽象概念
组成:
1、程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成
2、数据集:数据集则是程序在执行过程中所需要使用的资源
3、进程控制块:进程控制块用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。
阐释:进程与进程之间都占用的是独立的内存块,它们彼此之间的数据也是独立的
优点:同时利用多个CPU,能够同时进行多个操作
缺点:耗费资源(需要重新开辟内存空间)
构造方法:
Process([group [, target [, name [, args [, kwargs]]]]])
group: 线程组,目前还没有实现,库引用中提示必须是None;
target: 要执行的方法;
name: 进程名;
args/kwargs: 要传入方法的参数。
实例方法:
is_alive():返回进程是否在运行。
join([timeout]):阻塞当前上下文环境的进程程,直到调用此方法的进程终止或到达指定的timeout(可选参数)。
start():进程准备就绪,等待CPU调度
run():strat()调用run方法,如果实例进程时未制定传入target,这star执行t默认run()方法。
terminate():不管任务是否完成,立即停止工作进程
属性:
daemon:和线程的setDeamon功能一样
name:进程名字。
pid:进程号。
创建进程的方式有俩种
一,通过调用模块的方式来创建线程
# 进程模块 import multiprocessing import time def f1(): start = time.time() sum = 0 for n in range(100000000): sum += n print(sum) print("data:{}".format(time.time() - start)) if __name__ == '__main__': # windows在调用进程的时候,必须加这句话,否则会报错 li = [] p1 = multiprocessing.Process(target=f1) li.append(p1) p2 = multiprocessing.Process(target=f1) li.append(p2) for p in li: p.start() for i in li: i.join() print("ending...")
二,通过继承类的方式(推荐)
import multiprocessing class Process(multiprocessing.Process): def run(self): sum = 0 for n in range(100000000): sum += n print(sum) li = [] for i in range(2): p = Process() li.append(p) if __name__ == '__main__': for p in li: p.start() for i in li: i.join() print("ending")
进程之间的通信
创建进程模块的下队列(Queue)
# 进程之间的通信 Queue from multiprocessing import Queue, Process, Pipe import os,time,random def write(q): print("process to write{}".format(os.getpid())) for value in ["A","B","C"]: print("Put {} to queue...".format(value)) q.put(value) time.sleep(random.random()) def read(q): print("process to read{}".format(os.getpid())) while True: value = q.get(True) print("Get {} from queue".format(value)) if __name__ == '__main__': q = Queue() pw = Process(target=write,args=(q,)) # 这里传输的q是copy的 pr = Process(target=read,args=(q,)) pw.start() pr.start() pw.join() pr.terminate() # 强行终止进程(因为这个子进程定义了一个死循环)