计算机基础知识34

news2025/1/17 13:47:38

进程锁

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

# 保证安全

import time     # 导入time,执行顺序乱了
from multiprocessing import Process, Lock

def 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, Lock

def task():
    print("task进程的进程号:", os.getpid())      
    print("task进程的父进程的进程号:", os.getppid())   # parent process
    time.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 n
    n=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.join()
t.start()      # 与进程用法一样

今日思维导图:

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

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

相关文章

docker 部署mysql

Centos7为例 NAME"CentOS Linux" VERSION"7 (Core)" ID"centos" ID_LIKE"rhel fedora" VERSION_ID"7" PRETTY_NAME"CentOS Linux 7 (Core)" ANSI_COLOR"0;31" CPE_NAME"cpe:/o:centos:centos:7&qu…

【ubuntu】常用软件安装

【ubuntu】常用软件安装 前言安装搜狗输入法安装flameshot截图软件总结 前言 Ubuntu 是一个基于 Linux 内核的开源操作系统,它提供了简单易用的界面和丰富的功能,广受开发者和普通用户的喜爱。博主时常也需要经常切换Ubuntu系统进行开发和学习&#xff…

联邦学习综述四

A Survey on Security and Privacy of Federated Learning 选自:Future Generation Computer Systems,2020 本文介绍了联邦学习安全以及隐私方面面临的挑战,提出了一些现有的解决方案。 引言 联邦学习(FL)提供了一种通过将数据从中心服务…

在外包干了4年,我跑路了...

前言 先说一下自己的情况,本人普通本科毕业,19年的时候入的这行,在外包干了4年多功能测试,今年感觉自己不能够在这样下去了(虽然目前行业不太好),长时间呆在外包会让一个人慢慢废掉&#xff01…

IDEA如何拉取gitee项目?

1.登录gitee 说明:打开idea,在设置上面搜索框输入gitee,然后登录gitee注册的账号。 2. 创建gitee仓库 说明:创建idea中的gitee仓库。 3.寻找项目文件 说明:为需要添加gitee仓库的项目进行添加。 4.项目右键 说明&a…

一文带你GO语言入门

什么是go语言? Go语言(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go语言的主要特点包括:- 简洁和简单 - 语法简单明快,易于学习和使用 特点 高效 编译速度快,执行效率高 并发支持 原生支持并发,利用goroutine实现高效的并发…

Java OpenJDK 8u392 Windows x64

文章目录 (一)Azul(二)Adopt(三)IBM(四)Oracle (一)Azul WEB Page:🔗Download Azul Zulu Builds of OpenJDK Windows archive&#xf…

绝对详细的MyBatis代码生成器讲解

0.简介 在springboot工程中如果使用mybatis作为持久层框架,那必须知道如何自动生成 java 实体类、dao 层接口(mapper 接口)及mapper.xml文件,这样可以减少不必要的开发。 生成代码的方式有很多种,比如说利用idea的插…

rust学习—— 控制流if 表达式

控制流 根据条件是否为真来决定是否执行某些代码,或根据条件是否为真来重复运行一段代码,是大部分编程语言的基本组成部分。Rust 代码中最常见的用来控制执行流的结构是 if 表达式和循环。 if 表达式 if 表达式允许根据条件执行不同的代码分支。你提供…

C++学习:数据的存储、作用域、链接

一、数据的存储方式 C中使用3种不同的方案来存储数据,不同方案的区别在于数据在内存中保留的时间。 1、自动存储 在函数定义中声明的变量,以及函数的参数,是自动存储的。在程序执行对应函数的时候创建这些变量,对应的函数执行完…

别再卷组件库了,Vue 拖拽库都断代了!

前言 最近在测试 Tailwind CSS 和 Uno CSS 这两种原子化 CSS 工具是否能够有效减少打包后的文件体积时,先开始分析这些工具的优缺点,然后再直接上数据,最后做了一款经典的 TodoList 来进行测试,文章都写好了就差最后的数据了。 …

中国人民大学与加拿大女王大学金融硕士项目:开启你的金融精英之路

在全球化的今天,金融行业的发展日新月异,对金融人才的需求也日益增长。为了满足这一需求,中国人民大学与加拿大女王大学联合推出了金融硕士项目,旨在培养具有国际视野、专业素养和创新能力的金融精英。 这一开创性的项目将两大世…

VR全景图片如何拍摄制作,拍摄制作过程中要注意什么?

引言: VR全景图片就是通过专业的相机设备捕捉到的一个空间的高清图像,再经过专业工具进行拼合,呈现出一种环绕式的视觉效果。想象一下,当你站在一个完全真实的环境中,可以自由地转动视角,看到四周的景色&a…

2023.10(u盘刻录iso)主机,vmware,virtualbox安装linux/ubuntu/kali/centos stream9/arch

download 1 kali官网 2 ubuntu官网 3vmware workstation pro(最新版17pro) 4 virtualbox for linux sudo apt install virtualbox-ext-pack 5 win32 disk imger linux dd 刻录iso到u盘 #查看U盘路径 fdisk -l #图形界面 以kali为例会在桌面出现挂载图标 点开之后输入pwd寻…

基于svg+js实现简单动态时钟

实现思路 创建SVG容器&#xff1a;首先&#xff0c;创建一个SVG容器元素&#xff0c;用于容纳时钟的各个部分。指定SVG的宽度、高度以及命名空间。 <svg width"200" height"200" xmlns"http://www.w3.org/2000/svg"><!-- 在此添加时钟…

森海塞尔EW-DP SKP直插式发射机:真正的无失真录制

韦德马克&#xff0c;2023年9月15日 – 10月底&#xff0c;EW-DP系列将再添新品——EW-DP SKP直插式发射机&#xff0c;面向摄像师、广播电视公司和电影制作人。板载32位浮点录制&#xff0c;结合该系列领先的134 dB发射机动态范围&#xff0c;让音频失真不复存在。无论要在现场…

将 windows 控制台编码修改成UTF-8

将 windows 控制台编码修改成UTF-8 临时修改&#xff0c;在控制台输入以下命令&#xff0c;65001代表utf-8编码 chcp 65001重新打开控制台后&#xff0c;又会变成默认GBK编码 永久修改&#xff0c;设置>时间和语言>语言>管理语言设置 打开更改系统区域设置&#xf…

【Spring Boot项目】根据用户的角色控制数据库访问权限

文章目录 简介方法一添加数据库依赖配置数据库连接创建用户角色表创建Spring Data JPA实体和仓库实现自定义的网关过滤器配置网关过滤器几个简单的测试API 方法二创建数据库访问接口实现数据库访问接口创建用户角色判断逻辑创建网关过滤器配置网关过滤器 总结 简介 在一些特定…

0基础学习PyFlink——Map和Reduce函数处理单词统计

在很多讲解大数据的案例中&#xff0c;往往都会以一个单词统计例子来抛砖引玉。本文也不免俗&#xff0c;例子来源于PyFlink的《Table API Tutorial》&#xff0c;我们会通过几种方式统计不同的单词出现的个数&#xff0c;从而达到循序渐进的学习效果。 常规方法 # input.py …

《Python入门核心技术》专栏总目录

❤️ 专栏名称&#xff1a;《Python入门核心技术》 &#x1f338; 内容介绍&#xff1a;基础篇、进阶篇、Web篇、网络爬虫、数据分析、数据可视化、自动化等&#xff0c;适合零基础和进阶的同学。 &#x1f680; 订阅专栏&#xff1a;订阅后可阅读专栏内所有内容&#xff0c;专…