Python多任务编程-进程创建与实例 multiprocessing.Process()

1.多任务介绍

  • 多任务的概念:多任务(Multitasking)是指在同一时间内执行多个任务或者进程的能力。在操作系统中,多任务可以分为两种类型:基于进程的多任务和基于线程的多任务。例如电脑同时运行 QQ与微信程序。

  • 基于进程的多任务:基于进程的多任务指的是操作系统能够同时运行多个进程,并可以为每个进程分配独立的资源,如CPU、内存等。每个进程有自己独立的地址空间和资源,彼此之间没有任何直接联系。在计算机系统中,同时运行多个进程可以使系统的效率大大提高。

  • 基于线程的多任务:基于线程的多任务指的是在同一个进程中运行多个线程。不同于进程拥有独立的资源,线程共享同一个进程的地址空间和资源。因为线程之间的切换比进程之间的切换要快得多,基于线程的多任务执行效率更高,且消耗的资源更少。
  • 多任务的执行方式

    • 并发:单个CPU在一段时间内交替去执行任务

    • 并行:对于多核cpu处理多任务,操作系统会给cpu的每个内核安排一个执行的软件,多个内核是真正的一起执行软件。

2.进程

  • 进程的介绍:在Python程序中,想要实现多任务可以使用进程来完成,进程是实现多任务的一种方式。

  • 进程的概念:一个正在运行的程序或者软件就是一个进程,它是操作系统进行资源分配的基本单位,也就是说每启动一个进程,操作系统都会给其分配一定的运行资源(内存资源)保证进程的运行。

  • 注意:一个程序运行后至少有一个进程,一个进程默认有一个线程,进程里面可以创建多个线程,线程是依附在进程里面的,没有进程就没有线程。

Python多任务编程-进程创建与实例 multiprocessing.Process()_第1张图片

3.进程创建与多进程

  • 导入进程包

    import multiprocessing
  • 创建进程与参数传递(multiprocessing.Process())

    def login(name,password):
        return
    ​
    # 以元组方式给执行任务传参
    p1 = multiprocessing.Process(target=login,args=('python',11111),name='p1')
     
    # 以字典方式给执行任务传参
    p2 = multiprocessing.Process(target=login, kwargs={'name': 'itcast', 'password': 22222222}, name='p3')
  • Process进程创建——说明

    • 格式:Process(group,target,name,args,kwargs)

    • group:指定进程组,目前只能使用None

    • target:执行的目标任务名(方法名或者函数名)

    • name:给进程起的名字,默认是Process-1

    • 参数传递:

      • args:以元组方式给执行任务传参,一定要和任务参数的顺序保持一致。

      • kwargs: 以字典方式给执行任务传参,传参字典中的key一定要和参数名保持一致

  • 进程常用方法:

    1. start():启动子进程实例

    2. join():等待子进程执行结束

    3. terminate():不管任务是否完成,立即终止子进程

    4. os.getpid():获取当前进程编号

    5. os.getppid():获取当前父进程编号

    # 如果需要进程同步按照循序执行,需要用到进程等待join方法
    p1.start() #运行进程
    p1.join() # 等待进程p1执行完成后再执行其他的进程
         
    # 获取当前进程名称
    print('当前进程名称:',multiprocessing.current_process().name)
       
    # 获取当前进程编号(主进程与子进程皆可)
    print('当前进程:', os.getpid())
       
    # 获取主进程编号(子进程中使用)
    print('子进程的父进程编号:', os.getppid())

多进程完整代码实例:

# 导入多进程模块
import  multiprocessing
import os
​
def login(name,password):
    print('用户名:',name)
    print('密码:', password)

    # 获取当前进程名称
    print('进程名称:',multiprocessing.current_process().name)
    # 获取当前进程编号
    print('子进程:', os.getpid())
    # 获取主进程编号
    print('子进程的父进程编号:', os.getppid())
​
​
if __name__== '__main__':

    # 创建进程(不同参数传递方式)
    p1 = multiprocessing.Process(target=login,args=('python',11111111),name='p1')
    p2 = multiprocessing.Process(target=login,kwargs={'name':'itcast','password':22222222},name='p2')
    p3 = multiprocessing.Process(target=login, kwargs={'name': 'itcast', 'password': 22222222}, name='p3')

    # 运行进程指定对应函数业务逻辑
    # 如果需要进程同步按照循序执行,需要用到进程等待join方法
    p1.start() #运行进程
    # 等待进程p1执行完成后在执行其他的进程
    p1.join()
    p2.start()
    p2.join()
    p3.start()
    p3.join()
    # 获取当前进程编号
    print('主进程:',os.getpid())

4.进程的注意点

  • 进程之间不共享全局变量:创建子进程会对主进程资源进行拷贝,也就是说子进程是主进程的一个副本,好比是一对双胞胎,之所以进程之间不共享全局变量,是因为操作的不是同一个进程里面的全局变量,只不过不同进程里面的全局变量名字相同而已。

Python多任务编程-进程创建与实例 multiprocessing.Process()_第2张图片

  • 主进程会等待所有的子进程执行结束再结束。
  • 如何让主进程退出时,子进程销毁,不让主进程再等待子进程去执行
    • 第一种设置守护进程 daemon=True

          p1 = multiprocessing.Process(target=write_data,daemon=True)
          # 或者
          p1.daemon = True
    • 第二种 主动关闭子进程

      # 第二种 主动关闭子进程
      p2.terminate()


你可能感兴趣的:(python)