Python 进程和线程详解(multiprocessing、threading)

文章目录

  • 1 概述
    • 1.1 进程 VS 线程
    • 1.2 优缺点
  • 2 进程
    • 2.1 三个步骤
    • 2.2 多进程
    • 2.3 带参数
      • 2.3.1 元组参数 args
      • 2.3.2 字典参数 kwargs
    • 2.4 获取进程编号
    • 2.5 设置进程守护
  • 3 线程
    • 3.1 三个步骤
    • 3.2 多线程
    • 3.3 带参数
      • 2.3.1 元组参数 args
      • 2.3.2 字典参数 kwargs
    • 2.4 获取线程编号
    • 2.5 设置线程守护

1 概述

1.1 进程 VS 线程

进程
线程 1
线程 2
线程 N

举例说明:
进程:QQ.exe
线程:支撑 QQ.exe 运行的各个程序

1.2 优缺点

优点缺点
进程可用多核 CPU资源开销大
线程资源开销小只能单核 CPU

2 进程

2.1 三个步骤

# 1.导入进程包
import  ultiprocessing# 2.通过进程类创建进程对象,参数名有
# target: 执行的目标任务名(函数名、方法名)
# name  : 进程名,一般不用设置
# group : 进程组,一般不用设置
进程对象 = ultiprocessing.Process(target=任务名)# 3.启动进程
进程对象.start()

2.2 多进程

import multiprocessing
import time# 唱歌
def sing():for i in range(3):print("唱歌...")time.sleep(1)# 跳舞
def dance():for i in range(3):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = multiprocessing.Process(target=sing)dance_process = multiprocessing.Process(target=dance)sing_process.start()dance_process.start()

2.3 带参数

参数描述
元组 args参数有顺序要求
字典 kwargs参数无顺序要求
import multiprocessing
import time# 唱歌
def sing(num):for i in range(num):print("唱歌...")time.sleep(1)# 跳舞
def dance(num):for i in range(num):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = multiprocessing.Process(target=sing, args=(3,))dance_process = multiprocessing.Process(target=dance, kwargs={"num": 3})sing_process.start()dance_process.start()

2.3.1 元组参数 args

sing_process = multiprocessing.Process(target=sing, args=(3,))
sing_process.start()

2.3.2 字典参数 kwargs

sing_process = multiprocessing.Process(target=dance, kwargs={"num": 3})
sing_process.start()

2.4 获取进程编号

import osprint(os.getpid())  # 当前进程ID
print(os.getppid())  # 当前进程的父ID

2.5 设置进程守护

import multiprocessing
import time# 工作
def work():for i in range(10):print("工作中...")time.sleep(0.5)if __name__ == '__main__':work_process = multiprocessing.Process(target=work)# 设置守护进程work_process.daemon = Truework_process.start()time.sleep(1)print("主进程执行已完成!")

设置守护进程的前后对比图:
在这里插入图片描述

3 线程

3.1 三个步骤

# 1.导入线程模块
import threading# 2.通过线程类创建线程对象,参数名有
# target: 执行的目标任务名(函数名、方法名)
# name  : 线程名,一般不用设置
# group : 线程组,一般不用设置
线程对象 = threading.Thread(target=任务名)# 3.启动线程执行任务
线程对象.start()

3.2 多线程

import threading
import time# 唱歌
def sing():for i in range(3):print("唱歌...")time.sleep(1)# 跳舞
def dance():for i in range(3):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = threading.Thread(target=sing)dance_process = threading.Thread(target=dance)sing_process.start()dance_process.start()

3.3 带参数

  • 同进程
import threading
import time# 唱歌
def sing(num):for i in range(num):print("唱歌...")time.sleep(1)# 跳舞
def dance(num):for i in range(num):print("跳舞...")time.sleep(1)if __name__ == '__main__':sing_process = threading.Thread(target=sing, args=(3,))dance_process = threading.Thread(target=dance, kwargs={"num": 3})sing_process.start()dance_process.start()

2.3.1 元组参数 args

sing_process = multiprocessing.Thread(target=sing, args=(3,))
sing_process.start()

2.3.2 字典参数 kwargs

sing_process = multiprocessing.Thread(target=dance, kwargs={"num": 3})
sing_process.start()

2.4 获取线程编号

import threadingdef work():print(f"线程ID为: {threading.current_thread().ident}")if __name__ == '__main__':work_thread = threading.Thread(target=work)work_thread.start()

2.5 设置线程守护

  • 同 进程
import threading
import time# 工作
def work():for i in range(10):print("工作中...")time.sleep(0.5)if __name__ == '__main__':work_thread = threading.Thread(target=work)# 设置守护线程work_thread.setDaemon(True)work_thread.start()time.sleep(1)print("主进程执行已完成!")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/155624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UE4基础篇十七:分析性能

一、性能瓶颈定位 原文地址:小能猫吃牙膏:UE4 性能 - (一)瓶颈定位 P.S. 对于某个具体问题,我个人偏向于遵循 WHY → WHAT → HOW 的思考方法(重要性逐级递减) 加以理解。因为如果找不到做某件事情的意义(WHY)所在,或是对这件事情本身的定义(WHAT)都模棱两可,那么即便经…

【经验之谈·高频PCB电路设计常见的66个问题】

文章目录 1、如何选择PCB 板材?2、如何避免高频干扰?3、在高速设计中,如何解决信号的完整性问题?4、差分布线方式是如何实现的?5、对于只有一个输出端的时钟信号线,如何实现差分布线?6、接收端差…

特斯拉开启“涨涨涨”模式,一个月宣布涨价4次

KlipC报道:11月21日特斯拉中国官网上调了Model Y长续航全轮驱动版售价,一个月内,特斯拉进行第四次价格调整。 对此特斯拉将近期涨价的原因解释为 这次涨价相对于今年8月份的降价实际上属于‘价格回调’,一方面是因为特斯拉销量好&…

docker部署jdk21的镜像

docker Docker是一种开放源代码软件,可以帮助开发人员更轻松地创建、部署和运行应用程序。它是一种容器化技术,可以将应用程序及其依赖项打包在一个容器中,从而使应用程序更加便携和可移植。Docker将操作系统、应用程序和硬件虚拟化进行了彻底…

LeetCode算法心得——爬楼梯(记忆化搜索)

大家好,我是晴天学长,第二个记忆化搜索练习,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪 1)爬楼梯 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或…

Nacos和Eureka的区别

目录 配置: 区别: ephemeral设置为true时 ephemeral设置为false时(这里我使用的服务是order-service) 1. Nacos与eureka的共同点 都支持服务注册和服务拉取 都支持服务提供者心跳方式做健康检测 2. Nacos与Eu…

手把手带你在AutoDL上部署InternLM-Chat-7B Transformers

手把手带你在AutoDL上部署InternLM-Chat-7B Transformers 调用 项目地址:https://github.com/KMnO4-zx/self_llm.git 如果大家有其他模型想要部署教程,可以来仓库提交issue哦~ 也可以自己提交PR! InternLM-Chat-7B Transformers 部署调用 环…

演示命令执行漏洞无回现如何渗透

演示命令执行漏洞无回现如何渗透 在DNSlog 获取一个域名 使用dvwa中的命令执行来ping此域名 执行后在DNSlog收到解析,证明命令执行成功

【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编

🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言:你只管努力,剩下的交给时间! 目录 🏀直接操作寄存器点亮LED灯🏀地址空间🏀ARM内部的寄存…

KNN(k近邻法)算法理论和实战

KNN概念 k近邻法(k-nearest neighbor,k-NN)是一种基本分类与回归方法。 k近邻法的输入为实例的特征向量对应于特征空间的点;输出为实例的类别,可以取多类。 k近邻法假设给定一个训练数据集,其中的实例类…

Freeswitch中mod_commonds

mod_commands 整理来自Freeswitch官网 Table of Contents (click to expand) 0. About1. Usage 1.1 CLI1.2 API/Event Interfaces1.3 Scripting Interfaces1.4 From the Dialplan2. Format of returned data3. Core Commands 3.1 acl  3.1.1 Syntax3.1.2 Examples3.2 …

pytorch中gather函数的理解

pytorch函数gather理解 torch.gather(input, dim, index, outNone) → Tensor Parameters: input (Tensor) – 源张量dim (int) – 索引的轴index (LongTensor) – 聚合元素的下标(index需要是torch.longTensor类型)out (Tensor, optional) – 目标张量 公式含义 这个函数的…

短视频配音软件有哪些?这些常用的短视频配音软件

短视频行业近年来发展得很快,几乎闯入了我们每个现代人的生活,它以其独有的特点和乐趣,也收获了大批短视频爱好者,配音是短视频创作过程中不可或缺的环节,今天,我们就来聊聊短视频配音及好用的配音软件。 短…

一文读懂 Linux 网络 IO 模型

文章目录 1.从一个问题说起2.多进程模型3.多线程模型4.I/O 多路复用5.select、poll、epoll 的区别?5.1 select5.2 poll5.3 epoll5.4 两种事件触发模式 参考文献 1.从一个问题说起 互联网发展历史上,曾经有一个著名的问题:C10K 问题。 C 是 …

【SpringBoot】 环境准备

一.SpringBoot准备 1.下载idea 社区版 2021.1 - 2022.1.4 专业版 无要求 2.Maven 是一个工具,和Java没有关系 . 主要功能是项目构建和依赖管理. 项目构建 上述对应的都是maven命令 . 依赖管理 添加坐标之后,点击刷新,右侧就会载入依赖. Maven还有依赖传递和依赖排除功…

【Mysql学习笔记】- 2 多表查询

一、加强查询 where子句,oder by子句 -- 查询加强 -- ■ 使用where子句 -- ?如何查找1992.1.1后入职的员工 -- 老师说明: 在mysql中,日期类型可以直接比较, 需要注意格式 SELECT * FROM empWHERE hiredate > 1992-01-01 -- ■ 如何使用like操作符…

局域网文件共享神器:Landrop

文章目录 前言解决方案Landrop软件界面手机打开效果 软件操作 前言 平常为了方便传文件,我们都是使用微信或者QQ等聊天软件,互传文件。这样传输有两个问题: 必须登录微信或者QQ聊天软件。手机传电脑还有网页版微信,电脑传手机比…

Linux 环境配置小白入门

Linux从 全栈开发centOS 7 到 运维 一 Linux 入门概述1.1 操作系统1.2 Linux 简介1.3 Linux 系统组成1.4 Linux 发行版1.5 Linux 应用领域1.6 Linux vs Windows 二 虚拟机2.1 虚拟机介绍2.2 VMware WorkStation 安装2.3 VMware WorkStation 配置检查2.3 安装 CentOS 72.3.1 安装…

代码随想录算法训练营|五十九~六十天

下一个更大元素|| 503. 下一个更大元素 II - 力扣(LeetCode) 和每日温度一样的套路,就是这里可以循环数组,两个数组拼接,然后循环两遍就行。 public class Solution {public int[] NextGreaterElements(int[] nums)…

从零开始的c语言日记day35——数据在内存中的储存

数据类型介绍 之前已经学了了一些基本的内置类型,以及空间大小。 类型的意义: 使用这个类型开辟内存空间的大小(大小决定了使用范围)。如何看待内存空间的视角 类型的基本归类 整形: 字符的本质是ASCLL码值&#x…