当前位置: 首页 > news >正文

Python Process创建进程(2种方法)详解

虽然使用 os.fork() 方法可以启动多个进程,但这种方式显然不适合 Windows,而 Python 是跨平台的语言,所以 Python 绝不能仅仅局限于 Windows 系统,因此 Python 也提供了其他方式在 Windows 下创建新进程。

Python 在 multiprocessing 模块下提供了 Process 来创建新进程。与 Thread 类似的是,使用 Process 创建新进程也有两种方式:

以指定函数作为 target,创建 Process 对象即可创建新进程。

继承 Process 类,并重写它的 run() 方法来创建进程类,程序创建 Process 子类的实例作为进程。

Process 类也有如下类似的方法和属性:

run():重写该方法可实现进程的执行体。

start():该方法用于启动进程。

join([timeout]):该方法类似于线程的 join() 方法,当前进程必须等待被 join 的进程执行完成才能向下执行。

name:该属性用于设置或访问进程的名字。

is_alive():判断进程是否还活着。

daemon:该属性用于判断或设置进程的后台状态。

pid:返回进程的 ID。

authkey:返回进程的授权 key。

terminate():中断该进程。

以指定函数作为target创建新进程

下面先介绍以指定函数作为 target 来创建新进程。

import multiprocessing
import os# 定义一个普通的action函数,该函数准备作为进程执行体
def action(max):for i in range(max):print("(%s)子进程(父进程:(%s)):%d" %(os.getpid(), os.getppid(), i))
if __name__ == '__main__':# 下面是主程序(也就是主进程)for i in range(100):print("(%s)主进程: %d" % (os.getpid(), i))if i == 20:# 创建并启动第一个进程mp1 = multiprocessing.Process(target=action,args=(100,))mp1.start()# 创建并启动第一个进程mp2 = multiprocessing.Process(target=action,args=(100,))mp2.start()mp2.join()print('主进程执行完成!')

上面程序中第 15、16 两行代码就是程序创建并启动新进程的关键代码,不难发现这两行代码和创建并启动新线程的代码几乎一样,只是此处创建的是 multiprocessing.Process 对象。

运行上面程序,可以看到程序中运行了三个进程,一个主进程和程序启动的两个子进程。由于程序中调用了 mp2.join(),因此主进程必须等 mp2 进程完成后才能向下执行。

继承Process类创建子进程

继承 Process 类创建子进程的步骤如下:

定义继承 Process 的子类,重写其 run() 方法准备作为进程执行体。

创建 Process 子类的实例。

调用 Process 子类的实例的 start() 方法来启动进程。

下面程序通过继承 Process 类来创建子进程:

import multiprocessing
import osclass MyProcess(multiprocessing.Process):def __init__(self, max):self.max = maxsuper().__init__()# 重写run()方法作为进程执行体def run(self):for i in range(self.max):print("(%s)子进程(父进程:(%s)):%d" %(os.getpid(), os.getppid(), i))
if __name__ == '__main__':# 下面是主程序(也就是主进程)for i in range(100):print("(%s)主进程: %d" % (os.getpid(), i))if i == 20:# 创建并启动第一个进程mp1 = MyProcess(100)mp1.start()# 创建并启动第一个进程mp2 = MyProcess(100)mp2.start()mp2.join()print('主进程执行完成!')

该程序的运行结果与上一个程序的运行结果大致相同,它们只是创建进程的方式略有不同而已。

http://www.lryc.cn/news/285860.html

相关文章:

  • 树莓派4B 使用树莓派官方烧录器烧录ubuntu20.04.5 排坑
  • 鸿蒙开发(五)鸿蒙UI开发概览
  • 应用层—HTTP详解(抓包工具、报文格式、构造http等……)
  • ISA Server 2006部署网站对比nginx
  • CHAPTER 9: 《DESIGN A WEB CRAWLER》第9章 《设计一个web爬虫》
  • java SSM网上小卖部管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计
  • Java中集合元素的删除
  • HNU-数据挖掘-实验2-数据降维与可视化
  • 【shell编程入门】正则表达式
  • 高效火情监测,科技助力森林防火【数字地球开放平台】
  • 第14章_集合与数据结构拓展练习(前序、中序、后序遍历,线性结构,单向链表构建,单向链表及其反转,字符串压缩)
  • WEB前端3D变换效果以及如何应用js代码
  • Linux中的新建用户、切换用户
  • Vue3使用
  • BindingException: Invalid bound statement (not found): xxMapper.deleteBatchIds
  • 开源图床LightPicture搭建本地图片管理系统并实现无公网IP远程访问
  • 黑马苍穹外卖学习Day10
  • [数据结构 - C++] 红黑树RBTree
  • 《WebKit 技术内幕》学习之十(2): 插件与JavaScript扩展
  • 【头歌-数据分析与实践-python】数据分析与实践-python——python基础
  • 【数据库原理】(37)Web与数据库
  • STM32 TIM输出比较、PWM波形
  • React16源码: React中的updateClassComponent的源码实现
  • Mybatis 动态SQL(set)
  • Ubuntu18.04在线镜像仓库配置
  • 多数据源配置H2 Mysql
  • 【ASP.NET Core 基础知识】--路由和请求处理--路由概念(一)
  • 【Unity】RayMarching体积云理论学习
  • 物联网与智慧城市的无界未来:如何打破传统束缚,开启智能生活新篇章
  • nodejs下载安装