多任务--进程 及 进程间通信
进程三状态:
就绪状态 和 运行 和 阻塞 三个状态。
程序和进程的区别:
程序只有一份,进程可以有多个!
进程拥有资源,进程是最小的资源分配单位!
多任务-进程的初体验:
import time import multiprocessing def test01(): while True: print("{:=^20}".format(1)) time.sleep(1) def test02(): while True: print("{:=^20}".format(2)) time.sleep(1) if __name__ == '__main__': process1 = multiprocessing.Process(target=test01) process2 = multiprocessing.Process(target=test02) process1.start() process2.start()
进程和线程的对比和各自优缺点:
对比:
进程是最小的资源分配单位,线程是最终的执行单位。
线线程不能够独立执行,必须依存在进程中
优缺点:
线程和进程在使用上各有优缺点:线程执行开销小,但不利于资源的管理和保护;而进程正相反。
一般开发中,喜欢用的是多线程!
进程间通信:
其实,socket 就是一种进程间通信的方式!
通过磁盘上的文件也可以实现进程间通信!
下面说的是通过队列进行进程间通信!
一个进程直接向内存中写数据,另一个进程从内存汇总读数据!(这种方式,既没有用网络,也没用磁盘文件)
这个内存的特点是:先进先出,所以叫做通过队列完成进程间通信.
通过put向Queue 中放数据 ,通过get 从Queue 中读数据,
注:当Queue 中满时,put 放不进去(阻塞),当Queue 中空时,get不出来(阻塞)
Queue 示意图
进程间通信:
import multiprocessing import time def download_from_web(q): "模拟从网上下载数据" data = list([11,22,33,44]) #向队列中写入数据 for temp in data: q.put(temp) print("{:=^20}".format("下载完成,并以放入队列中")) def analysis_data(q): "模拟数据处理" worked_data = list() while True: print("receiving...") time.sleep(2) data = q.get() worked_data.append(data+1) print(worked_data) if q.empty(): print("接受完毕") break def main(): #1,创建一个队列 q = multiprocessing.Queue() #max 根据硬件条件而定 #2,将队列的引用当做实参传递到两个子进程中 process1 = multiprocessing.Process(target=download_from_web,args=(q,)) process2 = multiprocessing.Process(target=analysis_data,args=(q,)) process1.start() process2.start() if __name__ == '__main__': main()
共享数据:
关于进程间共享数据:
https://blog.csdn.net/houyanhua1/article/details/78244288