多进程_进程理解

思路渐进目录

  • 1、创建子进程
  • 2、测试Process对象的相关方法
  • 3、多进程执行顺序是不确定的
  • 4、进程之间不共享全局数据
  • 5、使用Queue完成进程之间的通信
  • 6、使用多进程完成文件的拷贝

实现过程代码

1、创建子进程

import time
import multiprocessing
import os


def proc_func(number,age):
   print(age)
   print("这是子进程%d PID:%d 父进程的PID:%d" % (number,os.getpid(),os.getppid()))
   for i in range(3):
       print("这是子进程")
       time.sleep(1)


if __name__ == '__main__':
   # 创建一个子进程 
   # 创建一个进程的执行计划 target指定子进程执行的函数代码 args指定函数代码所需的参数
   pro = multiprocessing.Process(target=proc_func, args=(100,), kwargs={'age':18})

   # PID process identify
   # os.getpid() 获取当前进程的PID
   # os.getppid() parent process identify 获取当前进程的父进程的PID
   # 启动子进程的创建和执行
   pro.start()

   # 用来判断子进程是否存活  存活返回True 退出了返回False
   print(pro.is_alive())

   # 用来阻塞等待子进程结束 然后才会继续往下执行 如果有参数 则表示阻塞等待的超时时间
   pro.join(1)
   print("join1 ")
   print(pro.is_alive())
   pro.join()
   print(pro.is_alive())
   # while True:
   #     print("这是主进程 PID:%d" % os.getpid())
   #     time.sleep(1)
   #     """如果创建子进程 怎么获取当前进程PID 当前进程的父进程的PID(PPID)"""

2、测试Process对象的相关方法

import time
import multiprocessing
import os


def proc_func(number,age):
    print(age)
    print("这是子进程%d PID:%d 父进程的PID:%d" % (number,os.getpid(),os.getppid()))
    for i in range(3):
        print("这是子进程")
        time.sleep(1)


if __name__ == '__main__':
    # 创建一个子进程 
    # 创建一个进程的执行计划 target指定子进程执行的函数代码 args指定函数代码所需的参数
    pro = multiprocessing.Process(target=proc_func, args=(100,), name='SSS',kwargs={'age':18})

    # PID process identify
    # os.getpid() 获取当前进程的PID
    # os.getppid() parent process identify 获取当前进程的父进程的PID
    # 启动子进程的创建和执行

    # 如果子进程还没有创建  则获取不到PID
    # print(pro.pid)

    pro.start()

    # 获取进程对象标识的 进程的名称
    print(pro.name)
    # os.getpid()
    print(pro.pid)
    print(pro.is_alive())

    # terminate()作用是告诉操作系统 让子进程退出 -----> 产生了时间差
    # pro.terminate()
    # time.sleep(0.1)
    pro.join()
    print(pro.is_alive())

3、多进程执行顺序是不确定的

import multiprocessing
import time


def worker1(no):
    while True:
        print(no)
        time.sleep(1)


def worker2(no):
    while True:
        print(no)
        time.sleep(1)


if __name__ == '__main__':
    # 多个进程执行顺序不确定
    for i in range(5):
        pro1 = multiprocessing.Process(target=worker1,args=(i,))
        pro1.start()

4、进程之间不共享全局数据

import multiprocessing
import time

g_number = 0

def worker1(no):
    print(g_number)
    global g_number
    g_number += 99
    while True:
        time.sleep(1)
        print("worker1 获取到的%d" % g_number)


def worker2(no):
    while True:
        time.sleep(1)
        print("worker2 获取到的%d" % g_number)


if __name__ == '__main__':
    # 多个进程内部不共享全局数据  ----> 每个进程是独立的数据空间
    # 在主进程创建子进程的时候  会将全局数据给子进程拷贝一份 
    # 在子进程中修改全局数据不影响其他进程的全局数据
    pro1 = multiprocessing.Process(target=worker1,args=(0,))
    pro1.start()

    pro2 = multiprocessing.Process(target=worker2,args=(1,))
    pro2.start()

5、使用Queue完成进程之间的通信

import multiprocessing
import time

"""主进程往队列中放入屏幕上输入的数据  子进程从队列中取出数据并且打印出来"""


def proc_func(queue):
    while True:
        if queue.empty():
            print("队列是空的 我稍后来取一次")
            time.sleep(2)
        else:
            data = queue.get()
            print("从队列中取出数据%s" % data)
            time.sleep(2)

if __name__ == '__main__':
    # 1 创建一个队列 参数表示队列的最大长度
    queue = multiprocessing.Queue(3)

    # 2 创建一个子进程
    pro = multiprocessing.Process(target=proc_func, args=(queue,))
    pro.start()

    # 3 录入数据 放入队列
    while True:
        if queue.full():
            print("队列已满")
            time.sleep(1)
        else:
            data = input("请输入:")
            queue.put(data)

        print("当前队列数据条数是%s" % queue.qsize())
        """如何创建队列 放数据 取数据"""

6、使用多进程完成文件的拷贝

import os
import multiprocessing
import time

def copy_file(src_path, file_name, dest_path, queue):
    """源目录 文件名 目的目录"""
    # demo    01.py  demo-备份

    # 打开一个源文件 读取
    src_file = open(src_path + '/' + file_name, 'rb')

    # 打开一个目标文件 写入 
    dest_file = open(dest_path + '/' + file_name, 'wb')

    file_data = src_file.read()
    dest_file.write(file_data)

    # 关闭文件
    src_file.close()
    dest_file.close()

    # 通过队列告诉主进程 我已经完成这个文件的拷贝
    queue.put(file_name)


if __name__ == '__main__':
    # 1 用户输入需要拷贝的源目录名称
    src_path = input("请输入你需要拷贝的目录名:")

    # 2 根据该目录名称 创建一个目的目录 -备份
    dest_path = src_path + '-备份'
    os.mkdir(dest_path)

    # 创建一个队列  -主进程 和 多个完成文件拷贝的子进程之间 进行通信
    queue = multiprocessing.Queue()

    # 3 获取到源目录下使用的文件信息列表 为每个文件复制任务创建一个进程完成
    file_list = os.listdir(src_path)
    for file in file_list:
        # print(file)
        pro = multiprocessing.Process(target=copy_file, args=(src_path, file, dest_path, queue))
        pro.start()

    # 计数 完成拷贝的文件数量
    count = 0
    while True:
        queue.get()
        count += 1
        print("\r 当前进度是%% %f" % (count / len(file_list) * 100), end='')
        time.sleep(0.4)
        if count == len(file_list):
            print("完成拷贝")
            break
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章