浅谈对进程的理解

进程:一个运行的程序(代码)就是一个进程,没有运行的代码叫程序,进程是系统资源分配的最小单位,进程拥有自己独立的内存空间,所有进程间数据不共享,开销大。

僵尸进程:进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait获取waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中的这些进程是僵尸进程。

孤儿进程:父进程退出,子进程还在运行的这些子进程都是孤儿进程,孤儿进程将被init进程(进程号为1)所收养,并由init进程对他们完成状态收集工作。

避免僵尸进程的方法:
fork两次用孙子进程去完成子进程的任务
用wait()函数使父进程阻塞
使用信号量,在signal handler中调用waitpid,这样父进程不用阻塞。
创建进程:

import os
from mulitprocessing import Process
import time
def pro_great(*args):
    for i in range(5):
        print("子进程正在运行中,pid=%d"%(,os.getpid())
        time.sleep(1)
if __name__ =="__main__":
    #创建Process对象
    p = Process(target=pro_great,kwargs={'m':20})
    #启动进程
    p.start()
    p.join()

创建进程池:

import time
import os
from multiprocessing import Pool
def jcc(num):
    print(num)
    print('进程已经创建id为%d'%os.getpid())
    time.sleep(1)
if __name__ == '__main__':
    p = Pool(3)
    for i in range(20):
        p.apply_async(jcc,(i,))
    p.close()
    p.join()

进程间的交互:
进程间的交互需要用到队列Queue

import time,os
from multiprocessing import *
def writ(q):
    listq=['a','c','v','n']
    for i in listq:
        q.put(i)
    time.sleep(3)
def reado(q):
    while True:
        if not q.empty():
            print(q.get())
        else:
            break
if __name__ == '__main__':
    q = Queue()
    qw = Process(target=writ,args=(q,))
    qw.start()
    qw.join()

    qe = Process(target=reado,args=(q,))
    qe.start()
    qe.join()

你可能感兴趣的:(python随笔)