关于进程和线程

目录

前言:

1进程:

1.1定义:

1.1.1进程是操作系统分配资源的基本单元,拥有自己的独立空间和资源。

1.1.2每个进程都有一个唯一的PID(进程标识符)来标识。

1.2进程间通信:

1.2.1进程不是孤立的,它们之间需要进行信息交互。

1.2.2可以使用multiprocessing模块的Queue实现进程间的数据传递。Queue是一个由操作系统开辟的消息队列空间。

1.3Queue的方法:

1.3.1put(item, block, timeout):将item写入消息队列。

1.3.2get(block, timeout):

 

1.4进程池Pool:

1.4.1用于管理多个进程的执行。

1.4.2方法包括apply_async(非阻塞方式调用函数)、close(关闭进程池)、join(等待进程池中的进程执行完毕)和terminate(立即终止所有任务)。

2线程:

2.1定义:

2.1.1线程是进程的实体,比进程更小的能独立运行的基本单位。

2.1.2线程基本不拥有系统资源,但共享其所属进程的资源。

2.2线程创建:

2.2.1使用threading.Thread类创建线程,可以指定线程组、要执行的方法、线程名等参数,这是比较常见的线程:

2.3线程的方法:

2.3.1isAlive():

2.3.2getName() / setName(name):

2.3.3isDaemon() / setDaemon(bool):

2.3.4start():启动线程。

2.3.5join():

2.4关于主线程和子线程:

2.4.1主线程:

2.4.2子线程:

2.5守护线程与非守护线程:

2.5.1非守护线程:

2.5.2守护线程:

3关于线程和进程的比较

3.1.资源占用:

3.2通信方式:

3.3并发性:

3.4稳定性:

3.5使用场景:

结语:


前言:

在前面我们已经学过了关于并发编程和和并行的关系,今天我要分享的就是关于进程和线程的内容,进程和线程是操作系统中两个非常重要的概念,它们在程序执行和资源管理方面有着不同的特点和用途.

1进程:

1.1定义

1.1.1进程是操作系统分配资源的基本单元,拥有自己的独立空间和资源。

1.1.2每个进程都有一个唯一的PID(进程标识符)来标识。

1.2进程间通信

1.2.1进程不是孤立的,它们之间需要进行信息交互。

1.2.2可以使用multiprocessing模块的Queue实现进程间的数据传递。Queue是一个由操作系统开辟的消息队列空间。

1.3Queue的方法

1.3.1put(item, block, timeout):将item写入消息队列。

  • 如果block为True且没有设置timeout,队列满时程序会被阻塞。
  • 如果设置了timeout,队列满时会等待timeout秒,之后若仍无空间则抛出Queue.full异常。
  • 如果block为False且队列满,立即抛出Queue.full异常

1.3.2get(block, timeout)

从消息队列中获取一条信息。

1.3.1如果block为True且没有设置timeout,队列空时程序会被阻塞。

1.3.2如果设置了timeout,队列空时会等待timeout秒,之后若仍无消息则抛出queue.empty异常。

1.3.3如果block为False且队列空,立即抛出queue.empty异常。

  • qsize():返回队列中的消息数量。
  • empty():如果队列为空,返回True。
  • full():如果队列满了,返回True。

 

1.4进程池Pool

1.4.1用于管理多个进程的执行。

1.4.2方法包括apply_async(非阻塞方式调用函数)、close(关闭进程池)、join(等待进程池中的进程执行完毕)和terminate(立即终止所有任务)。

2线程:

2.1定义

2.1.1线程是进程的实体,比进程更小的能独立运行的基本单位。

2.1.2线程基本不拥有系统资源,但共享其所属进程的资源。

2.2线程创建

2.2.1使用threading.Thread类创建线程,可以指定线程组、要执行的方法、线程名等参数,这是比较常见的线程:

threading.Tread(group, target, name, args, kwargs)

group:线程组

target:要执行的方法

name:线程名,默认thread-N

args/kwargs:传入给函数的参数

2.3线程的方法

2.3.1isAlive()

返回线程是否还在运行。

2.3.2getName() / setName(name)

获取/设置线程名。

2.3.3isDaemon() / setDaemon(bool)

判断/设置是否为守护线程(后台线程)。默认为False,即前台线程。当主线程执行完毕后,守护线程会随之停止,而前台线程会继续执行直到完成。

2.3.4start():启动线程。

2.3.5join()

等待调用该方法的线程执行完毕。

2.4关于主线程和子线程

2.4.1主线程:

程序启动时运行的线程称为主线程。

2.4.2子线程:

新创建的线程称为子线程或前台线程。

子线程的状态依赖于它所在的进程。如果进程没有退出,子线程能够正常运行;如果进程退出,所有线程(包括子线程)都会退出。但是,这通常取决于线程是否是守护线程以及操作系统的具体行为。在某些情况下,即使主线程结束,子线程也可能继续执行直到它们自己完成或被显式终止。然而,在Python中,如果主线程结束并且没有其他非守护线程在运行,整个进程通常会终止,不管其他守护线程是否已经完成。这是因为Python解释器在所有非守护线程完成后退出,这通常意味着主线程完成后退出。但请注意,这个行为可能依赖于具体的Python实现和平台。因此,在设计多线程程序时应该明确考虑线程的生命周期和同步机制以避免未定义的行为或资源泄漏等问题。

2.5守护线程与非守护线程:

在Python中,线程可以是守护线程或非守护线程。这是通过线程对象的setDaemon(bool)方法来设置的。如果设置为True,则该线程是守护线程;如果设置为False,则是非守护线程。默认情况下,新创建的线程是非守护线程。

2.5.1非守护线程

当程序中存在非守护线程时,主线程结束时并不会立即导致整个Python程序退出。相反,Python会等待所有非守护线程完成执行后才结束整个程序。

2.5.2守护线程

守护线程是一种在后台运行的线程。当程序中只剩下守护线程时,Python程序会退出,不会等待守护线程完成。换句话说,守护线程在主线程结束时会被强制终止,即使它们还没有完成执行

3关于线程和进程的比较

3.1.资源占用:

进程占用独立的内存空间和系统资源,而线程共享所在进程的内存空间和资源。因此,进程的创建、销毁和切换的开销较大,而线程的开销较小。

3.2通信方式:

进程之间需要通过IPC机制进行通信,相对复杂;而线程之间可以通过共享内存等方式进行通信,相对简单。

3.3并发性:

进程和线程都具有并发性,可以在同一时间段内并发执行。但是,由于线程共享进程的内存空间和资源,因此线程之间的调度和同步更加复杂。

3.4稳定性:

由于进程具有独立性,因此一个进程的崩溃不会影响其他进程;而线程之间缺乏独立性,一个线程的崩溃可能导致整个进程的崩溃。因此,在稳定性方面,进程相对更优。

3.5使用场景:

对于需要独立运行、资源占用较大或需要频繁创建和销毁的任务,适合使用进程;而对于需要共享资源、轻量级或需要高并发执行的任务,适合使用线程。在实际应用中,可以根据具体需求选择使用进程或线程。

结语:

好了,关于进程和线程我们今天就先分享到这里了,其实关于进程和线程的选择还是需要具体情况具体分析,这两者都给有优劣,希望大家在操作时可以明确自己想实现的效果,同时,也欢迎大家给我的文章斧正,有什么建议都可以提,同时也希望这篇文章能够帮助你对线程和进程有一个更加清楚的认识。

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

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

相关文章

搜索引擎都没流量啦,官网建设还有啥意义?

百度等搜索引擎都没啥流量了,再建设官网还有啥用?如果你把官网定位于获客,那真的没啥太大用处,但是官网不仅仅是用来获客的。 一、搜索引擎的流量被稀释了 搜索引擎流量减少的原因有多个, 1. 社交媒体的崛起&#xf…

电机控制系列模块解析(第八篇)—— 高频注入法

一、基本原理 在电机控制领域,高频方波注入法常用于估计转子的位置和转速。其工作原理是每隔一定的时间间隔在电机输出电压上叠加一个电压脉冲。然后,在两相静止坐标系下或者同步旋转坐标系下对采样时刻的电压和电流进行相应的计算,以实现对…

基于Python3的数据结构与算法 - 11 基数排序

一、引入 多关键字排序:假如现在有一个员工表。要求按照薪资排序,薪资相同的员工按照年龄排序。 先按照年龄进行排序,再按照薪资进行稳定的排序 按照这种思路我们对[32,13,94,52,17,54,93]排序: 先比较十位数的数字大小&#…

JS-04-javaScript数据类型和变量

一、数据类型 计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在JavaScript中定义了以下几种数据类型: 1-1、Number JavaScript不区分整数和浮点数&…

c++ set集合按位置(索引)查询元素的方法

在STL中集合好处是可以对输入的元素进行排序,就是说在某些情况下对某些需要有序的元素可以使用set集合存储。不过在set集合没有提供按值查询的方法。 在集合中,set集合不允许出现重复元素,使用multiset集合可以存储重复元素。 按位置查询 按…

RK平台内核解压方式

64 位平台 64 位平台的机器通常烧写Image,由U-Boot 加载到目标运行地址。但是 RK平台的 U-Boot 还可支持 对64位 LZ4格式的压缩内核进行解压。但是用户必须使能: CONFIG_LZ4y64位LZ4压缩内核的解压前、后地址必须定义在各平台的 rkxxx_common.h 文件中…

【C++】每日一题 128 最长连续序列

给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 #include <iostream> #include <vector> #include <unordered_set&g…

预训练模型的使用torchvision.model和timm

pytorch 自带的torchvision.models 加载已经下好的模型 如果您想在导入 ResNet-50 模型时指定 pretrainedFalse&#xff0c;表示不加载预训练权重&#xff0c;您可以按照以下方式进行&#xff1a; import torch import torchvision.models as models# 创建 ResNet-50 模型实…

目标检测——高压线绝缘子数据集

一、简介 绝缘子是电力系统中至关重要的部件,它承担着保障电力安全、可靠传输的重要任务。绝缘子的性能直接影响到高压输电线路的运行状态。绝缘子长期暴露在恶劣的自然环境中,如强风、雷电、高温、低温、盐雾等,这些环境因素都可能对绝缘子的性能产生不良影响,导致其出现…

西门子PLC的交互界面怎样设计?

西门子PLC的交互界面设计集中于提供一个直观、多功能且用户友好的环境&#xff0c;旨在使工程师和技术人员能够有效地进行编程、监控和维护。下面是一些设计西门子PLC交互界面时的关键考虑因素&#xff1a; 1. **图形化编程环境**&#xff1a;设计时&#xff0c;重点在于提供直…

关于Vivado的实施过程、SDC和XDC约束支持、Vivado实施子流程、Tcl API支持脚本

关于Vivado的实施过程 AMD Vivado™设计套件可实现以下AMD设备体系结构&#xff1a;AMD Versal™自适应计算加速平台&#xff08;自适应SoC&#xff09;&#xff0c;AMDUltraScale™、AMD UltraScale™和AMD 7系列FPGA。各种设计来源如下支持&#xff0c;包括&#xff1a; •…

【视频图像取证篇】模糊图片复原车牌号技术原理和实战应用小结

【视频图像取证篇】模糊图片复原车牌号技术原理和实战应用小结 模糊图片复原车牌号常用的技术原理和实战应用—【蘇小沐】 &#xff08;一&#xff09;运动模糊视频图像 由于各种各样的原因&#xff0c;主体或者拍摄设备运动共同造成的视频图像模糊等。 1、快门速度 快门速…

Vue事件处理:.passive修饰符与应用场景

.passive修饰符 passive这个修饰符会执行默认方法。你们可能会问&#xff0c;明明默认执行为什么会设置这样一个修饰符。这就要说一下这个修饰符的本意了。 浏览器只有等内核线程执行到事件监听器对应的JavaScript代码时&#xff0c;才能知道内部是否会调用preventDefa…

接口自动化测试用例的编写方法

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 关注公众号【互联网杂货铺】&#xff0c;回复 1 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 phpunit 接口自动化测试系列 Post接口自动化测试用例 Post方式…

2007-2022年上市公司迪博内部控制评价缺陷数量数据

2007-2022年上市公司迪博内部控制评价缺陷数量数据 1、时间&#xff1a;2007-2022年 2、范围&#xff1a;上市公司 3、指标&#xff1a;证券代码、证券简称、辖区、证监会行业、申万行业、是否存在财报内控重大缺陷、财报内控重大缺陷数量、是否存在财报内控重要缺陷、财报内…

植物病害识别:YOLO甘蔗叶片病害识别分类数据集

YOLO甘蔗叶片病害识别数据集, 包含尾孢菌叶斑病&#xff0c;眼斑病&#xff0c;健康&#xff0c;红腐病&#xff0c;锈病&#xff0c;黄叶病6个常见病类别&#xff0c;3300多张图像&#xff0c;yolo标注完整&#xff0c;全部原始图像&#xff0c;未应用增强。 适用于CV项目&…

【Web - 框架 - Vue】随笔 - Vue的简单使用(01) - 快速上手

【Web - 框架 - Vue】随笔 - Vue的简单使用(01) - 快速上手 Vue模板代码 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>模板</title> </head> <body> <div></di…

内容检索(2024.03.08)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 电源完整性理论与…

easyExcel多sheet导入表格

PostMapping("/importExcelOther")ApiOperationSupport(order 9)ApiOperation(value "导入excel数据", notes "传入excel文件")public R importExcelOther(RequestParam("file") MultipartFile file) {if (file.getSize()0){throw …

CMake笔记

CMake笔记 文章目录 CMake笔记1 工程项目一般形式2 常见命令2.1 project2.2 set2.3 message2.4 add_executable()2.5 语法原则2.6 add_subdirectory2.7 add_library2.8 list 3 安装3.1 安装.h文件/文本文件3.2 安装工程脚本3.3 安装目录/目录下内容3.4 安装库文件3.5安装过程 4…