Python-进程

发布于:2025-06-08 ⋅ 阅读:(23) ⋅ 点赞:(0)

进程

简介

操作系统分配资源的基本单位

创建

依赖

  • 依赖模块 multiprocessing 中的 Process

语法

Process(group[,target[,name[,args[,kwargs]]]])

  • target:如果传递了函数的引用,这个子进程就执行这里的代码
  • args:元组的方式传递,顺序保持一致,一个时得有逗号
  • kwargs:对象的方式传递参数,key 需要和参数名称保持一致
  • name:设定一个名字,可以不设定
  • group:指定进程组

方法

  • start():启动子进程实例(创建子进程)
  • is_alive():判断子进程是否存活
  • join([timeout]):是否等待子进程执行结束,或等待多少秒
  • terminate():不管任务是否完成,立即终止子进程

属性

  • name:当前进程的别名,默认process-N,N为从1开始递增的整数
  • pid:当前进程的pid(进程号)

状态

  • 就绪态:运行的条件都具备,正在等待cpu执行
  • 执行态:cpu正在执行其功能
  • 等待态:等待某些条件满足,例如一个程序sleep了,此时就处于等待状态

案例

创建进程
  • 代码
from multiprocessing import Process
import time

def sing(name, age):
    time.sleep(2)
    print('唱歌者姓名:' + name + ',年龄:' + str(age))
    print('正在唱歌...')


def dance(name, age):
    print('跳舞者姓名:' + name + ',年龄:' + str(age))
    print('正在跳舞...')



if __name__ == '__main__':
    # 构建两个进程
    p1 = Process(target=sing, args=('张学友', 30))
    p2 = Process(target=dance, kwargs={'name': '谢霆锋', 'age': 25})
    # 启动两个进程
    p1.start()
    p2.start()

  • 运行

在这里插入图片描述

发现问题
  • 先 start 的唱歌进程, 可结果输出确先是跳舞
  • 想想应该和线程类似,默认异步执行
解决问题

join(timeout) : 等待子进程执行完毕

  • 代码
from multiprocessing import Process
import time

def sing(name, age):
    time.sleep(2)
    print('唱歌者姓名:' + name + ',年龄:' + str(age))
    print('正在唱歌...')


def dance(name, age):
    print('跳舞者姓名:' + name + ',年龄:' + str(age))
    print('正在跳舞...')



if __name__ == '__main__':
    # 构建两个进程
    p1 = Process(target=sing, args=('张学友', 30))
    p2 = Process(target=dance, kwargs={'name': '谢霆锋', 'age': 25})
    # 启动两个进程
    p1.start()
    p1.join()
    p2.start()
    p2.join()
    print('主进程结束')

  • 运行

在这里插入图片描述

自定义名称
  • 代码
from multiprocessing import Process
import time


def sing(name, age):
    time.sleep(2)
    print('唱歌者姓名:' + name + ',年龄:' + str(age))
    print('正在唱歌...')


def dance(name, age):
    print('跳舞者姓名:' + name + ',年龄:' + str(age))
    print('正在跳舞...')


if __name__ == '__main__':
    # 构建两个进程
    p1 = Process(name='P-sing', target=sing, args=('张学友', 30))
    p2 = Process(name='P-dance', target=dance, kwargs={'name': '谢霆锋', 'age': 25})
    # 启动两个进程
    p1.start()
    print("进程名称:" + p1.name + " ,是否存活:" + str(p1.is_alive()))
    p1.join()
    print("进程名称:" + p1.name + " ,是否存活:" + str(p1.is_alive()))
    p2.start()
    print("进程名称:" + p2.name + " ,是否存活:" + str(p2.is_alive()))
    p2.join()
    print("进程名称:" + p2.name + " ,是否存活:" + str(p2.is_alive()))
    print('主进程结束')

  • 运行

在这里插入图片描述

资源不共享

案例:

  1. 读写两个进程
  2. 写进程往全局变量数组中添加元素
  3. 等写进程执行完毕后,再开启读进程
  • 代码
from multiprocessing import Process
import time


def write():
    for i in range(5):
        li.append(i)
        time.sleep(1)
    print('写入的数据:', li)


def read():
    print('读取的数据:', li)


li = []

if __name__ == '__main__':
    # 构建两个进程
    w = Process(name='P-W', target=write)
    r = Process(name='P-R', target=read)
    # 启动两个进程
    w.start()
    w.join() # 等待写入完成后再去读取
    r.start()

  • 运行

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到