计算机基础知识34

进程锁

# 锁在IT界很重要,不但在Python中出现,尤其是数据库中得锁更多,比如:表锁、行锁、      悲观锁、乐观锁、进程锁、互斥锁、递归锁、可重入锁、死锁等

# 保证安全

import time     # 导入time,执行顺序乱了
from multiprocessing import Process, Lockdef task(i, lock):       # 上一把锁    lock.acquire()print("进程%s来了" % i)time.sleep(1)print("进程%s走了" % i)    lock.release()       # 释放锁"""只要你上了锁,一定别忘了最后释放锁,否则的话,别的进程永远进不来"""if __name__ == '__main__':lock=Lock()    # 得到一把锁for i in range(3):p = Process(target=task, args=(i+1, lock))p.start()

# 同一时刻只有一个进程拿到这把锁,释放后下一个进程才会拿

# 加锁虽然保证了数据的安全,执行的效率一定是降低了

              # 该加锁一定要加

如何查看进程号

    p.pid()  子进程的进程号

import time,os
from multiprocessing import Process, Lockdef task():print("task进程的进程号:", os.getpid())      print("task进程的父进程的进程号:", os.getppid())   # parent processtime.sleep(20)
if __name__ == '__main__':p=Process(target=task, )p.start()print('子进程的进程号:', p.pid)print("主进程的进程号", os.getpid())time.sleep(10)

"""有了进程号,我们就可以通过进程号来结束进程的执行   kill 9176 kill -9 9176"""

# os.getpid() 写在哪个进程里面就会输出哪个进程的进程号

# taskkill / pid 9176    相当于手动结束命令

进程之间数据隔离问题

# 进程1中的a和进程2中的a完全不一样,且不能相互使用

n=100       # 主进程n还是不变
def task():global nn=1     # 改的子进程中的n

# 进程与进程之间数据如何通信?

队列(Queue)

数据结构:链表、单链表、双链表、循环链表、栈、队列、树、二叉树、图

队列特点: 先进先出

栈的特点:先进后出          python给我们提供了一个内置的队列类

from multiprocessing import Queue
q=Queue(3)         # 超过3个会阻塞,等出一个再进
q.put('hello')
q.put('world')     # 入队:往队列里面添加数据    
print(q.get())     # hello
print(q.get())     # world 出队:从队列里面取出值
q.put(self, obj, block=True, timeout=None)

# block=False: 队列放不进数据时,会立马报错

# timeout=3:超时的时间, 如果在指定的时间内,没有放进去,就会直接报错

q.put_nowait(self,obj):    # 值放不进去会直接报错return self.put(obj,False)

print(q.get())
print(q.get())       # 三个数都取出来了
print(q.get())

print(q.get())       # 第四个会阻塞等待put输值

q.get()  和q.put用法一样       q.get_nowait()

print(q.qsize())   # 取值完为0,还剩一个没取的就是1
print(q.empty())   # 看这个队列里还有没有数据   T/F
print(q.full())    # 看队列是否满不满    T/F

# 队列里面的数据在内存中存着的

      # 专业的消息队列:kafka, rabbitmq等,他们能够解决特殊场景的问题

生产者消费者模型(重要)

# 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题

   通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度

# 通过一个容器来解决强耦合问题,生产者和消费者不直接进行通讯

                                                                               

def producer():for i in range(10):q.put("生产的第%s个包子" % i)    # 放队列
def consumer():while True:res = q.get()       # 取队列,队列没有东西会一直等待print(res)if res is None:break
from multiprocessing import Prscess, Queue
if __name__ == '__main__':p = Process(target= producer)  # 生产者p.sart()c = Process(target= consumer)  # 消费者c.start()

# 改良版本:在生产完后放一个标志位,当取到标志位,break结束

线程

# 在一个进程中,线程就是必须存在的,至少要有一个线程来执行任务

# 一个进程中可以有多个线程

# 进程和线程都是有操作系统调度的

# 进程是操作系统分配资源的基本单位,线程是操作系统执行的最小单位

开启线程:

from threading import Thread
def task(a, b):pass
if __name__ == '__main__':t=Thread(target=task, name='Thread-2', args=('a', ), kwargs={'b':1})t.daemon = True # 把该线程设置为守护线程, 主线程执行完毕,子线程也结束t.start()

# 一个进程中如果只有一个线程,该线程称之为是主线程,其他线程称之为是子线程

   本身有一个主线程,def task是主线程拉起的一个子线程

           # 先子线程后主线程,和进程相反

              开线程的资源特别小,会立刻执行

              t.join() 确保子先后主

# 守护线程:主线结束,子进程立刻结束

t.is_alive()
t.setName('aaaa')    # 改名字
t.getName('aaaa') 
t.join()
t.start()      # 与进程用法一样
t.daemon = True
t.setDaemon(True)  # 守护线程 
threading.currentThread()  # 当前线程的对象
threading.enumerate()   # 返回正在运行的线程对象列表
threading.activeCount()  # 正在运行的线程数量

进程和线程的比较:

1、进程的开销比线程的开销大很多

2、进程之间的数据是隔离的,但是,线程直接的数据不隔离

3、多个进程之间的线程数据不共享--->还是让进程通信(IPC)--->进程下的线程也通信--->队列

今日思维导图:

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

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

相关文章

面试题-React(十五):React中的CSS编写方案及推荐

在React开发中,如何组织和编写CSS是一个常见的问题,React官方并没有一种固定的CSS编写方式,所以在目前的React开发中可能存在各种各样不同的编写CSS风格。本文将介绍React中几种常用的CSS编写方案,分析其优缺点,并推荐…

服务CPU异常飙高问题分析和解决

📢📢📢📣📣📣 哈喽!大家好,我是「奇点」,江湖人称 singularity。刚工作几年,想和大家一同进步🤝🤝 一位上进心十足的【Java ToB端大厂…

如何使用uview中的loadmore上拉加载

普通用法 HTML <view><view><!-- 内容 --></view><u-loadmore :status"status" /> </view> JS&#xff0c;onReachBottom这个是生命周期&#xff0c;和method同级 data() {return {goods:null,status: loadmore,//当前状态p…

1208. 翻硬币

题目&#xff1a; 1208. 翻硬币 - AcWing题库 思路&#xff1a; 1.对于要求从A变化到B的这类题&#xff0c;可以采用开关控制的方法。 2.一次翻转连续两个硬币&#xff0c;求origin变为result 最少需要翻转多少次。我们在origin的两个硬币中间放一个开关&#xff0c;开关变换…

除静电感测型离子风棒在无尘车间中的应用

除静电感测型离子风棒是一种能够检测静电并及时释放离子的离子风棒&#xff0c;在无尘车间中应用非常广泛。以下是除静电感测型离子风棒在无尘车间中的应用&#xff1a; 防止静电干扰&#xff1a;在无尘车间中&#xff0c;静电干扰会影响电子元器件和仪器设备的正常工作&#x…

基于STM32设计的智慧农业管理系统(ESP8266+腾讯云微信小程序)

一、项目介绍 基于STM32设计的智慧农业控制系统(ESP8266+腾讯云微信小程序) 1.1 项目背景 随着人们对食品安全和生态环境的日益重视,智慧农业逐渐成为一个备受关注的领域。智能化管理可以提高农业生产效率,减少资源浪费,改善生态环境。因此,基于物联网技术的智慧农业管理系…

数据结构-堆排序Java实现

目录 一、引言二、算法步骤三、原理演示步骤1: 构建最大堆步骤2: 交换和堆化步骤3: 排序完成 四、代码实战五、结论 一、引言 堆排序是一种利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或…

MySQL学习(八)——锁

文章目录 1. 锁概述2. 全局锁2.1 全局锁的必要性2.2 语法2.3 全局锁的特点 3. 表级锁3.1 表锁3.2 元数据锁3.3 意向锁3.4 自增锁 4. 行级锁4.1 介绍4.2 记录锁4.3 间隙锁4.4 临键锁 1. 锁概述 锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中&#xff0c;除传…

图像分割数据集的相关操作(二)—— albumentations 数据增强

前言 相比与torchvision 的 transform 库,albumentations 库提供了更丰富的增强操作和更高的性能;albumentations 通过使用 OpenCV 库实现增强操作,它采用了基于 NumPy 数组的处理方式,并通过并行化和内存优化来提高性能。相比之下,torchvision 的 transform 库是基于 Py…

2023亚马逊下半年的旺季选品攻略,黑五网一圣诞爆单机会不再错过

万圣节、黑五、网一和圣诞节是西方重要销售活动&#xff0c;也是跨境电商的一场重要考试&#xff0c;相对于国内的双十一双十二&#xff0c;这些节日的形成更为久远&#xff0c;需求也更加深入人心&#xff01;卖家需要根据市场需求和竞争情况选择细分品类&#xff0c;为更好的…

LabVIEW建立生产者消费者

LabVIEW建立生产者消费者 生产者/消费者设计模式由并行循环组成&#xff0c;这些循环分为两类&#xff1a;生产者循环和消费者循环。生产者循环和消费者循环间的通信可以使用队列或通道连线来实现。 队列 LabVIEW内置的队列操作VI可在函数选板>>数据通信>>队列操…

Atlas 200I DK目标检测与追踪技术记录

数据集 数据集采用MOT系列&#xff0c;MOT是多目标追踪常用数据集&#xff0c;MOT数据集对数据集进行了分帧&#xff0c;如要获得视频&#xff0c;需要先利用opencv里的cv2.VideoWriter模块便利图片文件夹&#xff0c;具体代码如下&#xff1a; import os import cv2img_path…

django cloudflare csrf 403

网站套了cloudflare flare发现登录接口403了&#xff0c;csrf验证失败&#xff0c; debug设置为False 详细报错如下&#xff1a; Reason given for failure: Referer checking failed - https://xxx/login does not match any trusted origins.In general, this can occur w…

Nginx正向代理,反向代理,负载均衡

Nginx正向代理&#xff0c;反向代理&#xff0c;负载均衡 Nginx当中有两种代理方式&#xff1a; 七层代理&#xff08;http协议&#xff09; 四层代理&#xff08;tcp/udp流量转发&#xff09; 七层代理&#xff1a;七层代理&#xff0c;代理的是http的请求和响应 客户端请求…

开源Vue盲盒商城4.0源码/网页盲盒源码/前端uniapp后端thinkphp+安装教程/亲测

源码简介&#xff1a; 开源Vue盲盒商城4.0源码&#xff0c;它是打包小程序app的网页盲盒源码,亲测可用&#xff0c;它是采用vueTP5框架开发开源盲盒网站源码&#xff0c;附带了安装教程。 简单测试过了&#xff0c;可以使用&#xff0c;大家可以自测下。 前端uniapp后端think…

Elasticsearch Relevance Engine---为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解]

Elasticsearch Relevance Engine—为AI变革提供高级搜索能力[ES向量搜索、常用配置参数、聚合功能等详解] 今天要介绍的 Elasticsearch Relevance Engine™ (ESRE™)&#xff0c;提供了多项用于创建高度相关的 AI 搜索应用程序的新功能。ESRE 站在 Elastic 这个搜索领域的巨人…

数据库设计与前端框架

数据库设计与前端框架 学习目标&#xff1a; 理解多租户的数据库设计方案 熟练使用PowerDesigner构建数据库模型理解前端工程的基本架构和执行流程 完成前端工程企业模块开发 多租户SaaS平台的数据库方案 多租户是什么 多租户技术&#xff08;Multi-TenancyTechnology&a…

Python8-使用json模块解析JSON文件

Python8-使用json模块解析JSON文件 json简介json模块使用 json简介 JSON (JavaScript Object Notation) 是一种用于存储和交换数据的轻量级数据格式。是一种常用的数据格式&#xff0c;用于在不同应用程序之间交换数据。 JSON 文件由键值对组成&#xff0c;键和值之间使用冒号…

C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例

相关 源码测试用例下载 https://download.csdn.net/download/he_zhidan/88430716 包括4个压缩包&#xff0c;初始代码&#xff0c;实现前缀和&#xff0c;实现前缀积&#xff0c;实现前缀异或。都是在前者的基础上修改的。 本博文是CSDN学院课程的讲义 https://edu.csdn.net/c…

15.2 主机探测与路由追踪

Ping 使用 Internet 控制消息协议&#xff08;ICMP&#xff09;来测试主机之间的连接。当用户发送一个 ping 请求时&#xff0c;则对应的发送一个 ICMP Echo 请求消息到目标主机&#xff0c;并等待目标主机回复一个 ICMP Echo 回应消息。如果目标主机接收到请求并且网络连接正常…