python中进程相关知识点。很强大

进程

# 单核CPU实现多任务:时间片轮转
--------------------------------------------------------------------------------------
重点(进程池,process类,Queue)
作业:如何利用fork创建三个进程.
--------------------------------------------------------------------------------------

一 linux系统下利用fork创建进程:

# fork在父子进程分别完成不同任务的方法。(根据返回值的不一样,利用if,else完成不同任务)
# 进程中的变量全部独立

1进程是一个具体的应用程序,线程是进程中的一个分支,为单独完成程序中的某一项或一组功能而存在。
应用程序可以有一个或多个进程,一个进程可以有一个或多个线程,其中一个是主线程(线程是进程中的实体,一个线程必须有一个父进程)。

2进程的执行顺序是由操作系统的调度算法决定的。造成调度的进程和子进程的顺序是不一样的。

3fork是通过复制的方式获得子进程。

4操作系统保存进程之间彼此是隔离的,不能通过通过全局变量让进程直接传递数据。

二multiprocessing import Process:
#直接利用process创建进程,传递任务函数,启动进程
#继承process类创建进程,重写run()启动进程调用的是start函数。
  1. Process创建的是子进程对象
  2. p.name,   p.pid,  p.is_alive()
  3. p.start(),  p.join(),  p.terminate()
  4. p.join()让父进程等待响应的子进程结束,并且回收资源。
  5. p.join()让父进程等待的状态称为阻塞
  6. P = Process(target = 函数名,name ='重命名',args=(),kwargs={})
  7. process里面的name是给进程对象进行重命名
  8. 用Process继承类,继承类的名字就是对象.name的名字
  9. 用Process继承类用的更多。继承类用run()方法,参数在继承类的__init__方法内传参
  10. run()方法实现的是进程对象具体的功能
  11. 判断p.is_alive()存活 的条件,在p.start()之后,在p.join()之前。


三进程池:批量创建进程的集合,当任务完成后,进程回到进程池,等待下次任务,复用进程。

  1. 异步添加任务是一次性向进程池添加任务。(进程池创建之后,如果不关闭进程池,父进程结束之后,程序就结束。所以需要进程池)。 

     19.   同步添加任务是任务按顺序添加,任务完成后添加下一个任务。(同步添加可以不用关闭进程池)。

  1. 进程池默认进程个数跟当前主机CPU的核数相关。print(os.cpu_count())#获得当前主机CPU的核数。
  2. p = Pool(3)   #设置进程池里面的进程数
  3. p.apply #阻塞式执行,就是任务挨个执行,任务执行完毕在进行下一个任务执行
  4. p.apply_async  #非阻塞式执行,批量处理任务,不等每个程序执行完毕执行。
  5. p.apply_async(func#定义p调用的函数功能,(i,)#传入的参数元祖))
  6. p.close() #异步添加任务即apply_async一定要close,原因是主进程执行结束会直接结束其他进程。#同步添加任务即apply不需要关闭close.
  7. p.terminate()#不管任务是否结束,立即终止任务。

四,queue队列 #实现进程中的通信
  1. q = Queue(3) # 初始化一个Queue对象,能够接受三条put消息:q.put('消息1'),q.put('消息2').....
  2. q.get(mst)用来取得数据q.get('消息')。。q.put('4',timeout=3)等待3秒阻塞。。
  3. 当队列满的时候,put可能会阻塞。q.put('4',block=flase)
  4. 如果消息数量大于需要接受的值,使用try,except来接受。
  5. 显示当前队列消息数量,使用q.qsize(); 判断都列是否为空,Queue.empty(),为空返回True,反之flase; Queue.full(),队列是否满了,满了返回True,反之flase
  6. q.get_nowait()等价于q.put('4',block=flase)
  7. 当队列为空,get可能会阻塞。q.get(block=flase)关闭阻塞。
  8. 进程池中如果要用Queue要通过Manager().Queue()
  9. 原理:在内存中开一段公共的缓冲区

五,僵尸进程 
  1. 子进程结束,资源没有回收称为僵尸进程。
  2. 父进程产生子进程,子进程结束,父进程正在进行,并且没有回收子进程资源。-僵尸进程
  3. os.wait() #让父进程等待子进程结束,并回收僵尸进程资源。意味着父进程要等待子进程代码先结束。
  4. 父进程产生子进程,父进程先结束,子进程在运行,称为孤儿进程。父进程pid被回收,被一个特定的进程收养。孤儿进程属于后台进程的一种,不会阻塞前台进程的输出。
  5. process创建的子进程,在创建的时候就关闭了键盘输入流。不可以从键盘读入内容。
  6. fork,process都会产生僵尸进程。回收僵尸进程的语句是:process的join,fork的wait。

猜你喜欢

转载自blog.csdn.net/Chen_chong__/article/details/72855572