2024.6.10 一

Python多进程

进程
一系列有序指令集用来实现某些功能,每个进程都有自己独立的一块内存空间,一个进程可以有多个线程.
程序就是我们安装好的应用,我们打开程序时,就创建了相应的进程,操作系统会为进程分配相应的资源

线程
是进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享进程分配的资源和数据。

因此,我们在切换线程时的负担比切换进程小很多,毕竟线程时共享资源的

两者关系
根本区别:进程是操作系统资源分配的基本单位,而线程是处理器任务调度和执行的基本单位,也是cpu可调度的最小单位

资源开销:每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程可以看做轻量级的进程,同一类线程共享代码和数据空间,每个线程都有自己独立的运行栈和程序计数器(PC),线程之间切换的开销小。

包含关系:如果一个进程内有多个线程,则执行过程不是一条线的,而是多条线(线程)共同完成的;线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。

内存分配:同一进程的线程共享本进程的地址空间和资源,而进程之间的地址空间和资源是相互独立的

影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响,但是一个线程崩溃整个进程都死掉。所以多进程要比多线程健壮。

多进程库

python中想要创建进程需要使用multiprocessing库,我们只有用其中的Process类来创建进程

import multiprocessing
procsess1=Process(group,target,name,args,kwargs)

因为不学所以这里带过

并发和并行
并发是指
两个时间同时发生,但是进行时交替执行
并行是指
多个任务同时执行

多线程库
python中想要创建线程需要使用threading库,我们只有用其中的Process类来创建进程

import threading

我们有两种方式创建线程

函数式:

t1=Thread(target,name,args,kwargs)

target: 线程将要执行的目标函数。
name: 线程的名称。
args: 目标函数的参数,以元组形式传递。
kwargs: 目标函数的关键字参数,以字典形式传递。

继承式:

class SubThread(Thread):def run:print('ok')

启动
我们创建了线程后,我们想要线程运行起来,需要用到线程的start方法

线程名.start()

start运行的是target传过去的函数,或者是新创建子类里的run函数
也就是说,基于Thread类的线程都会执行run函数
而且每个线程只能start一次,多了会报错

阻塞

当多个线程运行时,它们的先后是由cpu调度决定的,我们不可控
我们有时需要线程由先后的顺序,调用thread.join()的作用是确保thread子线程执行完毕后才能执行下一个线程

线程名.join(times)

join的作用是等待线程执行完它的任务然后销毁线程
有参数的话,最多等待线程执行times秒,之后不管线程有没有执行完都会销毁

join()的作用是,在子线程完成运行之前,这个子线程的父线程将一直被阻塞。确保其他的正常代码不会在线程没有执行完时就执行

共享

需要注意的是,我们在创建线程时,如果需要一个共享的量,那么我们需要将其设为全局变量

global gonggong

但这也会导致另一个问题,就是一个变量在操作前会同时被两个线程使用,会出现类似同时卖出第n张票的情况

Lock锁
锁对象可以看作把共享资源上锁,在被锁定时,别的线程不能进来操作,只有在锁被release之后才可以继续
我们一般再target函数或者子类的run里面用锁
一般是在操作全局变量那里锁上,操作完再释放,不要锁循环
我们在使用锁的时候,需要创建一个锁对象

lock1=threading.Lock()#创建锁
lock1.acquire()#上锁
lock1.release()#解锁

用锁会导致线程速度变慢,而且可能会只有部分线程被调度,但是可以保护数据

经典线程模型—生产者消费者
由两个线程,一个执行存入操作,一个执行取出操作,当没有的时候取出会等待存入先操作
这种实现需要一个线程的队列优先级(Queue)

内置模块Queue

import queue

我们使用时需要先创建一个队列

queue1=queue.Queue(max)
#max表示队列的最大容量

往往这个队列要作为参数传入函数中
Queue.get() 从队列中取出元素遵循fifo规则,即先进先出,如果队列为空,get()方法会阻塞直到有元素可用。
Queue.put(item) 写入队列,如果队列已满,put()方法会阻塞直到有空余空间。
Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号,每完成一个调用一次
Queue.join() 实际上意味着等到队列为空(等到队列操作完了),再执行别的操作
Queue.empty() 判断是不是空的,是返回true,不是返回false

如果线程里每从队列里取一次,但没有执行task_done(),则join无法判断队列到底有没有结束,在最后执行个join()是等不到结果的,会一直挂起。
可以理解为,每task_done一次 就从队列里删掉一个元素,这样在最后join的时候根据队列长度是否为零来判断队列是否结束,从而执行主线程。
————————————————

                        版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/sjyttkl/article/details/79887720
queue可以避免手动上锁,非常豪用

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

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

相关文章

Java24:会话管理 过滤器 监听器

一 会话管理 1.cookie 是一种客户端会话技术,cookie由服务端产生,它是服务器存放在浏览器的一小份数据,浏览器 以后每次访问服务器的时候都会将这小份的数据带到服务器去。 //创建cookie对象 Cookie cookie1new Cookie("…

vuInhub靶场实战系列--Kioptrix Level #3

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 arp-scan主机扫描 2.2 端口扫描2.3 指纹识别2.4 目…

智能合约中外部调用漏洞

外部调用 : 在智能合约开发中,调用不受信任的外部合约是一个常见的安全风险点。这是因为,当你调用另一个合约的函数时,你实际上是在执行那个合约的代码,而这可能会引入你未曾预料的行为,包括恶意行为。下面…

基于Ascend C的FlashAttention算子性能优化最佳实践

LLM的Attention部分处理给计算系统带来巨大的计算和访存压力。业界先后出现FlashAttention、FlashAttention2等算法,通过计算等价和切分有效降低HBM数据访问量。 昇腾异构计算架构CANN针对昇腾AI处理器的片上内存和缓存大小,以及数据搬运通路&#xff0…

为Nanopi m1交叉编译opencv

为Nanopi m1交叉编译opencv 一、下载交叉编译器 根据之前的博客进行 二、下载opencv和必要库 sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-devgit clone https://github.com/opencv/opencv.git cd opencv三、进行编…

鸿蒙开发必备:《DevEco Studio 系列一:实用功能解析与常用快捷键大全》

系列文章目录 文章目录 系列文章目录前言一、下载与安装小黑板 二、IDE被忽略的实用功能-帮助(Help)1.Quick Start2. API Reference3.FAQ 三、常用快捷键一、编辑二、查找或替换三、编译与运行四、调试五、其他 前言 DevEco Studio)是基于In…

nginx-虚拟主机如何配置

8、 nginx 命令功能 nginx -c /path/nginx.conf # 以特定目录下的配置文件启动nginx: nginx -s reload # 修改配置后重新加载生效 nginx -s stop # 快速停止nginx nginx -s quit # 正常停止nginx nginx -t # 测试当前配置文件…

协程库——面试问题

1 同步、异步 1.1 同步 代码顺序执行,完全由用户控制. 同步阻塞 等待可读、可写的时候阻塞,不让出cpu。读、写之后,下面的代码才能执行、 同步非阻塞 等待可读、可写时,不会阻塞cpu,返回失败,设置错误码为…

I/O 系统的功能、模型与接口

目录 I/O 系统的基本功能 1. 设备独立性 2. 缓冲 3. 设备共享 4. 高速缓存 5. 设备管理 I/O 系统的层次结构与模型 1. 单块传输模型 2. 缓冲管理模型 3. 通道模型 4. 虚拟设备模型 5. 直接内存访问(DMA)模型 6. 层次结构示意图 I/O…

【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279

【代码随想录训练营】【Day 48】【动态规划-7】| 卡码 57, Leetcode 322, 279 需强化知识点 python 的幂次计算, 10 ** 5, 10 **(0.5) 题目 卡码 57. 爬楼梯(第八期模拟笔试) 注…

RK3568-修改fiq-debugger调试串口

瑞芯微SDK默认将uart2_m0作为调试串口,以下方法将调试串口修改为uart5_m1。修改bootloader 修改/OK3568-linux-source/rkbin/tools/ddrbin_param.txt文件,5表示串口5。1表示复用m1。执行./ddrbin_tool ddrbin_param.txt ../bin/rk35/rk3568_ddr_1560MHz_v1.11.bin命令修改ub…

Permissions 0644 for ‘/home/jsy/.ssh/id_rsa‘ are too open

1、问题 执行git pull --rebase 报错 WARNING: UNPROTECTED PRIVATE KEY FILE! Permissions 0644 for /home/jsy/.ssh/id_rsa are too open. It is required that your private key files are NOT accessible by others. This private key will be ignored. Load key…

el-table 实现表头置顶【干货满满】附源码

a)一般情况下,想要在 ElTable 上实现表头固定,滑动滚动条时希望表头常显,不被滚动条顶上去。这时候就需要给表格添加高度,但是这个高度需要提前确定好,不是很方便,表格上边一段距离不是固定的,常…

字节面试:CPU100% 如何处理?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中,最近有小伙伴拿到了一线互联网企业如得物、阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格,遇到很多很重要的线上问题的场景题: 1.CPU100%,你是怎么处理的&…

操作系统复习-存储管理之虚拟内存

虚拟内存概述 有些进程实际需要的内存很大,超过物理内存的容量。多道程序设计,使得每个进程可用物理内存更加稀缺。不可能无限增加物理内存,物理内存总有不够的时候。虚拟内存是操作系统内存管理的关键技术。使得多道程序运行和大程序运行称…

算法金 | A - Z,115 个数据科学 机器学习 江湖黑话(全面)

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 机器学习本质上和数据科学一样都是依赖概率统计,今天整整那些听起来让人头大的机器学习江湖黑话 A - C A/B Testing (A/B …

windows域控共享网络驱动器

背景 假设在一家公司,有新入职的员工。我们给其创建了域账号,有一些共享的文件需要其可以直接访问到。我们可以采用共享目录的形式,但是每次都要输入共享端的ip或者主机名,比较麻烦。我们希望创建的域账号访问共享文件更便捷一些…

数据库原理(概论)——(1)

数据库概述 一、数据库的四个基本概念 1.数据 描述事物的符号记录 2.数据库 数据库是长期存储在计算机内的、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和存储、具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共…

注解 - @RequestBody

注解简介 在今天的每日一注解中,我们将探讨RequestBody注解。RequestBody是Spring框架中的一个注解,用于将HTTP请求体中的内容绑定到控制器方法的参数上,通常用于处理JSON数据。 注解定义 RequestBody注解用于将HTTP请求体的内容绑定到方法…

-31-()

在终端运行时消除输入空格对程序的影响可以使用{在scanf后加“getchar()”或者在scanf(“空格%d”,&a)} 按位与和移位操作符只能用于整数且都要转位二进制后进行相应操作 不创建临时变量,实现两个数的交换:1——使用加减法&…