进程:一个运行起来的程序或者软件叫做进程
1.1 每次启动一个进程都向操作系统索要运行资源,进程是操作系统资源分配的基本单位
1.2默认情况下启动一个进程默认只有一条线程,这个线程主线程,线程是依附在进程里面,没有
进程就没有线程,进程可以有多个线程
进程和线程的对比:
进程:每次启动一个进程都需要向操作系统索要运行资源,进程是操作系统资源分配的基本单位
线程:执行代码的分支,线程是cpu调度的基本单位,线程是依附在进程里面的,没有进程就线程,默认一个进程只有一个线程,但是可以开辟多个线程。
进程不共享全局变量,线程共享全局变量但是要注意资源竞争数据错误的问题,可以使用线程同步或着互斥锁。
多进程开发比单进程多线程开发稳定性要强,因为某个进程死了不会影响其他进程的运行,但是单进程多线程开发,如果这个进程死了,那么进程中的所有线程都不能再运行了
多进程开发比单进程开发资源要分配得多,多线程可以利用进程中的资源,但是每次启动一个进程都需要向操作系统索要运行资源。
线程和进程在使用上各有优缺点:
线程执行开销小,但不利于资源的管理和保护;而进程正相反。
正常情况下主进程会等待所有的子进程执行完成以后程序再退出。
导入模块名 :import os (文件、目录操作)
os.getpid():获取当前进程的编号
os.getppid(): 获取父进程的编号
os.kill(编号,9):根据进程编号杀死对应的进程,9表示强制杀死
导入进程模块:import multiprocessing
multiprocessing.Process():创建子进程
变量名.start():子进程开始运行
变量名.join():主进程等待写入进程执行完成以后程序再往下继续执行
变量名.daemon = True :设置守护主进程, 主进程退出后子进程直接销毁了
变量名.terminate() :让子进程直接销毁,不管任务是否完成,立即终止
multiprocessing.current_process(): 获取当前进程对象
multiprocessing.Queue():创建消息队列
变量名.put(): 放入数据
变量名.put_nowait():不会等待队列有空闲位置再放入数据,如果数据放入不成功就直接崩溃
变量名.get():读取数据
注意点:队列为空时,使用get方法会等待,直到队列有数据以后再取值
变量名.get_nowait():队列为空,取值的时候不等待,但是取不到值那么直接崩溃了
变量名.full():查看变量名是否是满的
注意点:只使用put放入数据直接判断队列是否为空获取的结果不正确,因为没有等队列把数据写完直接就取获取了,那么这是队列是空的。
变量名.qsize():查看队列的个数 # mac 版本不能使用qsize()
变量名.empty():队列为空
变量名.multiprocessing.Pool():创建进程池
变量名.apply():同步执行进程池:表示一个任务执行完成另外一个任务才能执行
变量名.aqqly_async():异步执行进程池:不会等待其它任务执行完成以后再去执行,多个任务一起执行
变量名.join():主进程阻塞,等待子进程的退出, 必须在close或terminate之后使用
注1:主进程与进程池之间的同步:一个一个执行
注2:主进程与进程池之间的异步:多个任务一起执行,异步时不会主进程不会等待进程池执行,会直接结束。