[Python]多任务编程--进程(二)

简介: [Python]多任务编程--进程(二)

3 获取当前父进程编号

os.getppid() 表示获取当前父进程编号

示例代码:

# 导入进程包
import multiprocessing
import time
# 导入获取进程编号相关的模块
import os
# 唱歌任务
def sing():
    print('sing(): ')
    # 获取当前进程的id
    sing_process_id = os.getpid()
    # 获取当前进程对象
    sing_process_object = multiprocessing.current_process()
    print(sing_process_object, sing_process_id)
    print('父进程编号:', os.getppid())
    for i in range(5):
        print('唱歌中...')
        time.sleep(0.2)
# 跳舞任务
def dance():
    print('dance(): ')
    # 获取当前进程的id
    dance_process_id = os.getpid()
    # 获取当前进程对象
    dance_process_object = multiprocessing.current_process()
    print(dance_process_object, dance_process_id)
    print('父进程编号:', os.getppid())
    for i in range(5):
        print('跳舞中...')
        time.sleep(0.2)
# 判断当前运行的是否为主进程
if __name__ == '__main__':
    print('main: ')
    # 获取当前进程的id
    main_process_id = os.getpid()
    # 获取当前进程对象
    main_process_object = multiprocessing.current_process()
    print(main_process_object, main_process_id)
    # 创建跳舞的子进程
    dance_process = multiprocessing.Process(group=None, target=dance, name='dance')
    # 创建唱歌的子进程
    sing_process = multiprocessing.Process(target=sing, name='sing')
    # 启动子进程
    dance_process.start()
    sing_process.start()

4 扩展

获取进程名

语法:

进程对象.name
# 导入进程包
import multiprocessing
import time
# 导入获取进程编号相关的模块
import os
# 唱歌任务
def sing():
    print('sing(): ')
    # 获取当前进程对象
    sing_process_object = multiprocessing.current_process()
    print('进程名:', sing_process_object.name)
    for i in range(5):
        print('唱歌中...')
        time.sleep(0.2)
# 判断当前运行的是否为主进程
if __name__ == '__main__':
    print('main: ')
    # 获取当前进程对象
    main_process_object = multiprocessing.current_process()
    print('进程名:', main_process_object.name)
    # 创建唱歌的子进程
    sing_process = multiprocessing.Process(target=sing, name='sing')
    # 启动子进程
    sing_process.start()

根据进程编号强制杀死指定进程

语法

import os
# 第二个参数为杀死进程的方式,9 -- 强制杀死进程
os.kill(要杀死的进程编号, 9)
# 导入进程包
import multiprocessing
import time
# 导入获取进程编号相关的模块
import os
# 唱歌任务
def sing():
    print('sing(): ')
    # 获取当前进程对象
    sing_process_object = multiprocessing.current_process()
    print('进程名:', sing_process_object.name)
    for i in range(5):
        print('唱歌中...')
        time.sleep(0.2)
        os.kill(os.getpid(), 9)
# 判断当前运行的是否为主进程
if __name__ == '__main__':
    print('main: ')
    # 获取当前进程对象
    main_process_object = multiprocessing.current_process()
    print('进程名:', main_process_object.name)
    # 创建唱歌的子进程
    sing_process = multiprocessing.Process(target=sing, name='sing')
    # 启动子进程
    sing_process.start()

进程执行带有参数的任务

1. 进程执行带有参数的任务的介绍

Process类执行任务并给任务传参数有两种方式:

(1)args 表示以元组的方式给执行任务传参

(2)kwargs 表示以字典方式给执行任务传参

2. args参数的使用

元组方式传参(args): 元组方式传参一定要和参数的顺序保持一致

使用元组的方式进行传参,如果参数只有一个,元组的第一个逗号不能省略。

import multiprocessing
# 显示信息的任务
def show_info(name, age):
    print(name, age)
if __name__ == '__main__':
    # 创建子进程
    # 向任务传参使用 args 元组方式传参
    show_info_process = multiprocessing.Process(target=show_info, args=('zs', 20))
    # 启动子进程
    show_info_process.start()

3. kwargs参数的使用

字典方式传参(kwargs): 字典方式传参字典中的key一定要和参数名保持一致

import multiprocessing
# 显示信息的任务
def show_info(name, age):
    print(name, age)
if __name__ == '__main__':
    # 创建子进程
    # 向任务传参使用 args 元组方式传参
    show_info_process = multiprocessing.Process(target=show_info, kwargs={'name': 'zs', 'age': 29})
    # 启动子进程
    show_info_process.start()

第一个参数的传递使用元组,第二个参数的传递使用字典:

import multiprocessing
# 显示信息的任务
def show_info(name, age):
    print(name, age)
if __name__ == '__main__':
    # 创建子进程
    # 向任务传参使用 args 元组方式传参
    show_info_process = multiprocessing.Process(target=show_info, args=('zs',), kwargs={'age': 29})
    # 启动子进程
    show_info_process.start()

进程的注意点

1. 进程的注意点介绍

(1)进程之间不共享全局变量

(2)主进程会等待所有的子进程执行结束再结束

2. 进程之间不共享全局变量

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

Windows下多进程程序,如果在主进程中没有if __name__ == '__main__':,会报错,因为创建子进程会对主进程资源进行拷贝,也就是说,子进程的代码与主进程一模一样,当主进程调用子进程时,由于子进程中存在直接执行新建子进程和调用子进程的代码,会出现无限递归调用,所以会报错。如果加上if __name__ == '__main__':判断,不是主进程就不会执行新建子进程和调用子进程的代码。

import multiprocessing
import time
# 定义全局变量
g_list = list()
# 添加数据的任务
def add_data():
    for i in range(5):
        g_list.append(i)
        print("add:", i)
        time.sleep(0.2)
    # 代码执行到此,说明数据添加完成
    print("add_data:", g_list)
def read_data():
    print("read_data", g_list)
if __name__ == '__main__':
    # 创建添加数据的子进程
    add_data_process = multiprocessing.Process(target=add_data)
    # 创建读取数据的子进程
    read_data_process = multiprocessing.Process(target=read_data)
    # 启动子进程执行对应的任务
    add_data_process.start()
    # 主进程等待添加数据的子进程执行完成以后程序再继续往下执行,读取数据
    add_data_process.join()
    read_data_process.start()
    print("main:", g_list)
    # 总结: 多进程之间不共享全局变量

进程之间不共享全局变量的解释效果图:

3. 主进程会等待所有的子进程执行结束再结束

假如我们现在创建一个子进程,这个子进程执行完大概需要2秒钟,现在让主进程执行0.5秒钟就退出程序,查看一下执行结果,示例代码如下:

import multiprocessing
import time
# 定义进程所需要执行的任务
def task():
    for i in range(10):
        print("任务执行中...")
        time.sleep(0.2)
if __name__ == '__main__':
    # 创建子进程
    sub_process = multiprocessing.Process(target=task)
    sub_process.start()
    # 主进程延时0.5秒钟
    time.sleep(0.5)
    print("over")
    exit()
    # 总结: 主进程会等待所有的子进程执行完成以后程序再退出

4. 主进程结束整个程序结束

为了保证子进程能够正常的运行,主进程会等所有的子进程执行完成以后再销毁,设置守护主进程的目的是主进程退出子进程销毁,不让主进程再等待子进程去执行。

  1. 守护主进程:
  • 守护主进程就是主进程退出子进程销毁不再执行,主进程结束执行,整个程序结束执行。
  • 语法:子进程对象.daemon = True
  1. 子进程销毁:
  • 主进程要结束时候,将子进程销毁,子进程执行结束,整个程序结束。
  • 语法:子进程对象.terminate()

4.1 设置守护主进程:

在pycharm中可能执行不出效果,需要在终端执行代码。(Windows)

import multiprocessing
import time
# 定义进程所需要执行的任务
def task():
    for i in range(10):
        print("任务执行中...")
        time.sleep(0.2)
if __name__ == '__main__':
    # 创建子进程
    sub_process = multiprocessing.Process(target=task)
    # 设置守护主进程,主进程退出子进程直接销毁,子进程的生命周期依赖与主进程
    sub_process.daemon = True
    sub_process.start()
    time.sleep(0.5)
    print("over")
    # 总结: 主进程会等待所有的子进程执行完成以后程序再退出
    # 如果想要主进程退出子进程销毁,可以设置守护主进程或者在主进程退出之前让子进程销毁

4.2 主进程结束时子进程销毁:

在pycharm中可能执行不出效果,需要在终端执行代码。(Windows)

import multiprocessing
import time
# 定义进程所需要执行的任务
def task():
    for i in range(10):
        print("任务执行中...")
        time.sleep(0.2)
if __name__ == '__main__':
    # 创建子进程
    sub_process = multiprocessing.Process(target=task)
    sub_process.start()
    time.sleep(0.5)
    print("over")
    # 让子进程销毁
    sub_process.terminate()
    exit()
    # 总结: 主进程会等待所有的子进程执行完成以后程序再退出
    # 如果想要主进程退出子进程销毁,可以设置守护主进程或者在主进程退出之前让子进程销毁


相关文章
|
1月前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
21天前
|
Unix Linux 程序员
[oeasy]python053_学编程为什么从hello_world_开始
视频介绍了“Hello World”程序的由来及其在编程中的重要性。从贝尔实验室诞生的Unix系统和C语言说起,讲述了“Hello World”作为经典示例的起源和流传过程。文章还探讨了C语言对其他编程语言的影响,以及它在系统编程中的地位。最后总结了“Hello World”、print、小括号和双引号等编程概念的来源。
105 80
|
10天前
|
Python
[oeasy]python055_python编程_容易出现的问题_函数名的重新赋值_print_int
本文介绍了Python编程中容易出现的问题,特别是函数名、类名和模块名的重新赋值。通过具体示例展示了将内建函数(如`print`、`int`、`max`)或模块名(如`os`)重新赋值为其他类型后,会导致原有功能失效。例如,将`print`赋值为整数后,无法再用其输出内容;将`int`赋值为整数后,无法再进行类型转换。重新赋值后,这些名称失去了原有的功能,可能导致程序错误。总结指出,已有的函数名、类名和模块名不适合覆盖赋新值,否则会失去原有功能。如果需要使用类似的变量名,建议采用其他命名方式以避免冲突。
30 14
|
2天前
|
存储 安全 数据可视化
用Python实现简单的任务自动化
本文介绍如何使用Python实现任务自动化,提高效率和准确性。通过三个实用案例展示:1. 使用`smtplib`和`schedule`库自动发送邮件提醒;2. 利用`shutil`和`os`库自动备份文件;3. 借助`requests`库自动下载网页内容。每个案例包含详细代码和解释,并附带注意事项。掌握这些技能有助于个人和企业优化流程、节约成本。
25 3
|
29天前
|
数据采集 存储 监控
21个Python脚本自动执行日常任务(2)
21个Python脚本自动执行日常任务(2)
91 7
21个Python脚本自动执行日常任务(2)
|
21天前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
89 13
|
20天前
|
分布式计算 大数据 数据处理
技术评测:MaxCompute MaxFrame——阿里云自研分布式计算框架的Python编程接口
随着大数据和人工智能技术的发展,数据处理的需求日益增长。阿里云推出的MaxCompute MaxFrame(简称“MaxFrame”)是一个专为Python开发者设计的分布式计算框架,它不仅支持Python编程接口,还能直接利用MaxCompute的云原生大数据计算资源和服务。本文将通过一系列最佳实践测评,探讨MaxFrame在分布式Pandas处理以及大语言模型数据处理场景中的表现,并分析其在实际工作中的应用潜力。
57 2
|
1月前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
48 10
|
1月前
|
人工智能 数据挖掘 开发者
探索Python编程之美:从基础到进阶
本文是一篇深入浅出的Python编程指南,旨在帮助初学者理解Python编程的核心概念,并引导他们逐步掌握更高级的技术。文章不仅涵盖了Python的基础语法,还深入探讨了面向对象编程、函数式编程等高级主题。通过丰富的代码示例和实践项目,读者将能够巩固所学知识,提升编程技能。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考和启示。让我们一起踏上Python编程的美妙旅程吧!
|
1月前
|
人工智能 数据可视化 数据挖掘
探索Python编程:从基础到高级
在这篇文章中,我们将一起深入探索Python编程的世界。无论你是初学者还是有经验的程序员,都可以从中获得新的知识和技能。我们将从Python的基础语法开始,然后逐步过渡到更复杂的主题,如面向对象编程、异常处理和模块使用。最后,我们将通过一些实际的代码示例,来展示如何应用这些知识解决实际问题。让我们一起开启Python编程的旅程吧!