• Python多进程编程-multiprocessing库


    Python多进程编程-multiprocessing库

    1.概述

    进程(Process)是指计算机中已运行的程序,是系统进行资源分配和调度的基本单位,不同的进程之间互不干涉,每个进程都有自己的堆栈,它们之间的数据不共享。

    在当代面向线程设计的计算机结构中,进程是线程的容器。进程是程序真正运行的实例,若干进程可能与同一个程序相关,且每个进程皆可以同步或异步的方式独立运行。

    进程执行时的间断性,决定了进程可能具有多种状态。事实上,运行中的进程可能具有以下三种基本状态:

    1)就绪状态(Ready)
    进程已获得除处理器外的所需资源,等待分配处理器资源;只要分配了处理器进程就可执行。就绪进程可以按多个优先级来划分队列。例如,当一个进程由于时间片用完而进入就绪状态时,排入低优先级队列;当进程由I/O操作完成而进入就绪状态时,排入高优先级队列。
    2)运行状态(Running):
    进程占用处理器资源;处于此状态的进程的数目小于等于处理器的数目。在没有其他进程可以执行时(如所有进程都在阻塞状态),通常会自动执行系统的空闲进程。
    3)阻塞状态(Blocked):
    由于进程等待某种条件(如I/O操作或进程同步),在条件满足之前无法继续执行。该事件发生前即使把处理器资源分配给该进程,也无法运行。

    与程序区别:

    1.程序是指令和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态的概念。
    2.程序可以作为一种软件资料长期存在,而进程是有一定生命期的。程序是永久的,进程是暂时的。 进程更能真实地描述并发,而程序不能;
    3.进程是由进程控制块、程序段、数据段三部分组成; 进程具有创建其他进程的功能,而程序没有。
    4.同一程序同时运行于若干个数据集合上,它将属于若干个不同的进程,也就是说同一程序可以对应多个进程。
    5.在传统的操作系统中,程序并不能独立运行,作为资源分配和独立运行的基本单元都是进程。

    2.多进程实战-文件的复制

    # Authors:xaiobei
    # ###文件的复制###
    
    from multiprocessing import Process
    import os,time
    #copy函数
    def copyFile(path,topath):
        #以二进制形式读写,因为文件并非都是文本类型
        with open(path,"rb") as fr:
            data = fr.read()
        with open(topath,"wb") as fw:
            fw.write(data)
        #os.getpid()返回进程号(PID),创建不同的子进程,PID不同
        print("[子进程]: %s 启动"%os.getpid())
    if __name__ == "__main__":
        print("---主进程启动---")
        start = time.time()
        # 获取文件列表(这里是相对路径,可以改为绝对路径)
        fileList = os.listdir("file")
        #循环处理文件
        for file in fileList:
            #合成路径
            path = os.path.join("file",file)
            topath = os.path.join("tofile",file)
            #循环创建子进程,分别处理不同的文件,与直接调用--copyFile(path,topath)---的区别是:
                #1.直接调用时,一个文件复制完之后才能继续复制下一个
                #2.创建子进程时可以不必等待上一个文件复制完成,把不同的任务分配给不同的子进程同时进行
                #3.在处理大量文件时,多进程可以极大的提高效率,但由于创建进程比较耗时,在处理少量文件时效率甚至不如直接调用快
            process = Process(target = copyFile,args=(path,topath)) #args参数是一个元组,当只传递一个参数时,表示为(x,)
            # 开始子进程
            process.start()
            #子进程加入主进程,在所有子进程结束后,主进程才继续向下执行(主进程等待子进程执行完成)
            process.join()
        end = time.time()
        time = end-start
        print("---主进程结束---")
        print("用时%.2f s"%time)

    3.进程池

    示意图:

    进程池

    # Authors:xaiobei
    # ###文件的复制###
    
    from multiprocessing import Pool
    import os,time
    def copyFile(path,topath):
        with open(path,"rb") as fr:
            data = fr.read()
        with open(topath,"wb") as fw:
            fw.write(data)
        #os.getpid()返回进程号(PID),创建不同的子进程,PID不同 os.getppid()返回父进程(PID)
        print("[子进程]: %s 启动"%os.getpid())
        #在此停滞2s突出效果
        time.sleep(2)
    if __name__ == "__main__":
        print("---主进程启动---")
        start = time.time()
        # 创建进程池,默认数CPU核心数,当参数大于默认值时,CPU的核心交替执行不同的进程
        poo = Pool(2)
        fileList = os.listdir("file")
        for file in fileList:
            path = os.path.join("file",file)
            topath = os.path.join("tofile",file)
            # 在进程池中加入进程,统一管理
            poo.apply_async(copyFile,args=(path,topath))
        # 当进程池close后,无法再向其中添加进程
        poo.close()
        # 进程池加入主进程,当进程池中所有子进程结束后,主进程才继续向下执行(主进程等待子进程执行完成)
        poo.join()
        end = time.time()
        time = end-start
        print("---主进程结束---")
        print("用时%.2f s"%time)
  • 相关阅读:
    17多校6 HDU
    E. Present for Vitalik the Philatelist 反演+容斥
    HDU
    F. Cowmpany Cowmpensation dp+拉格朗日插值
    hdu6088 组合数+反演+拆系数fft
    任意模数fft
    Codeforces Round #258 (Div. 2)E
    bzoj3670: [Noi2014]动物园
    HDU
    IO-InputStreamReader
  • 原文地址:https://www.cnblogs.com/slz99/p/12527734.html
Copyright © 2020-2023  润新知