Python 进程的创建 - multiprocessing

2024-08-21 04:58

本文主要是介绍Python 进程的创建 - multiprocessing,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

仅用学习参考,转载请注明出处

进程的创建-multiprocessing

multiprocessing模块就是跨平台版本的多进程模块,提供了一个Process类来代表一个进程对象,这个对象可以理解为是一个独立的进程,可以执行另外的事情

2个while循环一起执行,同时两人循环买烟

[root@server01 process]# vim test.py # -*- coding:utf-8 -*-
from multiprocessing import Process
import timedef bug_ciggite():while True:print("第一个人:胖子老板来包蓝利群")time.sleep(1)def main():# 第一个人开启一个子进程来执行循环买烟的操作   p = Process(target=bug_ciggite)p.start()# 第二个人来跟胖子老板买烟while True:print("第二个人:胖子老板来包芙蓉王")time.sleep(1)if __name__ == "__main__":main()

执行如下:

[root@server01 process]# python test.py 
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群

从上面的执行来看,两个while循环买烟的操作并没有被阻塞,例如不需要第一个循环执行完毕,才能执行第二个循环。而是直接可以两个循环同时进行。

  • 创建子进程时,只需要传入一个执行函数和函数的参数,创建一个Process实例,用start()方法启动。
    这个操作跟启动线程是一样的。

进程pid

打印上面代码的主进程和子进程的pid看看。

# -*- coding:utf-8 -*-
from multiprocessing import Process
import time
import osdef bug_ciggite():while True:print("第一个人:胖子老板来包蓝利群")print("打印子进程的pid=%d" % os.getpid())time.sleep(1)def main():print("打印主进程的pid=%d" % os.getpid())# 第一个人开启一个子进程来执行循环买烟的操作   p = Process(target=bug_ciggite)p.start()# 第二个人来跟胖子老板买烟while True:print("第二个人:胖子老板来包芙蓉王")time.sleep(1)if __name__ == "__main__":main()

执行如下:

[root@server01 process]# python test.py 
打印主进程的pid=1864
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
打印子进程的pid=1865
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
打印子进程的pid=1865
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群

Process语法结构如下:

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

target:如果传递了函数的引用,可以任务这个子进程就执行这里的代码
args:给target指定的函数传递的参数,以元组的方式传递
kwargs:给target指定的函数传递命名参数
name:给进程设定一个名字,可以不设定
group:指定进程组,大多数情况下用不到

Process创建的实例对象的常用方法:

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

Process创建的实例对象的常用属性:

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

给子进程指定的函数传递参数 - 买多少钱的烟

# -*- coding:utf-8 -*-
from multiprocessing import Process
import time
import osdef bug_ciggite(name,price,**kwargs):while True:print("第一个人:胖子老板来包蓝利群")print("打印子进程的pid=%d" % os.getpid())print("买包%d的%s" % (price,name))print(kwargs)time.sleep(1)def main():print("打印主进程的pid=%d" % os.getpid())   # 第一个人开启一个子进程来执行循环买烟的操作   p = Process(target=bug_ciggite,args=('蓝利群',17),kwargs={"m":20})p.start()# 第二个人来跟胖子老板买烟while True:print("第二个人:胖子老板来包芙蓉王")time.sleep(1)if __name__ == "__main__":main()

执行如下:

[root@server01 process]# python test.py 
打印主进程的pid=1904
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
打印子进程的pid=1905
买包17的蓝利群
{'m': 20}
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
打印子进程的pid=1905
买包17的蓝利群
{'m': 20}
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
打印子进程的pid=1905
买包17的蓝利群
{'m': 20}
第二个人:胖子老板来包芙蓉王
第一个人:胖子老板来包蓝利群
打印子进程的pid=1905
买包17的蓝利群
{'m': 20}

进程间不共享全局变量

定义一个全局变量,使用两个进程分别修改,然后分别打印,查看是否相同。
例如:定义一包烟的名称,两个进程,一个修改,一个不修改,分开打印。

# -*- coding:utf-8 -*-
from multiprocessing import Process
import time
import osciggite_name = "蓝利群"def bug_ciggite1():ciggite_name = '芙蓉王'for i in range(3):print("第一个人:胖子老板来包%s" % ciggite_name )time.sleep(1)def bug_ciggite2():for i in range(3):print("第二个人: 胖子老板来包 %s" % ciggite_name)time.sleep(1)def main():print("打印主进程的pid=%d" % os.getpid())   print("主进程开始执行:我要买%s" % ciggite_name)# 第一个人开启一个子进程来执行循环买烟的操作   p1 = Process(target=bug_ciggite1)p1.start()# 第二个人开启子进程买烟p2 = Process(target=bug_ciggite2)p2.start()print("主进程结束执行:我要买%s" % ciggite_name)if __name__ == "__main__":main()

执行如下:

[root@server01 process]# python test.py 
打印主进程的pid=2014
主进程开始执行:我要买蓝利群
主进程结束执行:我要买蓝利群
第一个人:胖子老板来包芙蓉王
第二个人: 胖子老板来包 蓝利群
第二个人: 胖子老板来包 蓝利群
第一个人:胖子老板来包芙蓉王
第一个人:胖子老板来包芙蓉王
第二个人: 胖子老板来包 蓝利群
[root@server01 process]# 

可以从结果中看出,第一个进程修改了ciggite_name为芙蓉王,但是却不影响主进程和子进程的值,依然是蓝利群。
说明子进程并不能共享修改全局变量,这一点与线程是有区别的。

13423234-7907ae6344e86e8a.png

关注微信公众号,回复【资料】、Python、PHP、JAVA、web,则可获得Python、PHP、JAVA、前端等视频资料。

这篇关于Python 进程的创建 - multiprocessing的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092187

相关文章

Linux kill正在执行的后台任务 kill进程组使用详解

《Linuxkill正在执行的后台任务kill进程组使用详解》文章介绍了两个脚本的功能和区别,以及执行这些脚本时遇到的进程管理问题,通过查看进程树、使用`kill`命令和`lsof`命令,分析了子... 目录零. 用到的命令一. 待执行的脚本二. 执行含子进程的脚本,并kill2.1 进程查看2.2 遇到的

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

k8s按需创建PV和使用PVC详解

《k8s按需创建PV和使用PVC详解》Kubernetes中,PV和PVC用于管理持久存储,StorageClass实现动态PV分配,PVC声明存储需求并绑定PV,通过kubectl验证状态,注意回收... 目录1.按需创建 PV(使用 StorageClass)创建 StorageClass2.创建 PV

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

Linux创建服务使用systemctl管理详解

《Linux创建服务使用systemctl管理详解》文章指导在Linux中创建systemd服务,设置文件权限为所有者读写、其他只读,重新加载配置,启动服务并检查状态,确保服务正常运行,关键步骤包括权... 目录创建服务 /usr/lib/systemd/system/设置服务文件权限:所有者读写js,其他

基于Python开发Windows自动更新控制工具

《基于Python开发Windows自动更新控制工具》在当今数字化时代,操作系统更新已成为计算机维护的重要组成部分,本文介绍一款基于Python和PyQt5的Windows自动更新控制工具,有需要的可... 目录设计原理与技术实现系统架构概述数学建模工具界面完整代码实现技术深度分析多层级控制理论服务层控制注