【python笔记】并发编程

news2024/12/22 19:44:21

前言

菜某的笔记总结分享。有错误请指正。

并发编程的意义

并发编程是用来提升代码执行的效率的。

名词理解

进程和线程

我们可以这样理解进程和线程。进程是一个工厂,线程是工厂里的一条流水线。

我们要让我们产品的生产效率提高,我们可以多开工厂(进程),也可以在一个工厂中增加流水线(线程)。

但是开设工厂的成本相对于增加流水线要高。

工厂(进程)给流水线(线程)原料,但是真正操作的是流水线(线程)。

当我们运行一个python文件时,他会创建一个进程,同时配备一个线程。进程储存了数据,线程真正执行代码。

当一个程序拿过来时,我们可以把他分开,一个进程或者线程做一部分,最后把结果总和起来,就实现并发。

多线程

多线程需要threading模块

创建线程并且使用的方法

设置函数创建线程

就是我们设置一个函数,我们可以创建一个线程帮助我们运行这个函数

import threading

def func(a,b,c):#定义一个函数

    pass

t=threading.Tread(target=func,agrs=(1,2,3))#创建线程

t.start()#开始运行线程

agrs是参数,帮助我们传递函数的参数。

案例

利用多线程快速下载图片

结果下载成功

设置类创建线程

创建一个类,让他继承父类之后,这个类中的run方法就会被执行。

这里定义了两个方法,但是结果会发现,他会发现只有run被执行了。

线程常用的方法

t.start()#开始执行线程

t.join()#主线程等待t线程运行完毕后再运行

t.setDaemon(布尔值)#创建守护进程

布尔值为true,主线程执行完线程自动关闭

false,主线程在线程都执行完毕后才会关闭

设置获取线程的名称

t.setName()#设置线程的名字

threading.current_thread().getName()#获取当前线程的名字

threading.current_thread()#获取当前运行的线程

案例

线程的名称设置案例

多线程应用可能出现的数据混乱问题

我们用多线程的时候,cpu会被划片的让一个片的线程进入,但是呢cpu是一个线程执行一部分然后再执行另一个线程,之后再回来执行当前的线程。这就会导致一个问题。

比如我们在执行一个大的计算的时候,有时我们一个线程算到一半,cpu去执行另一个线程,而另一个线程也会对原先的数进行操作,于是这个数就变化了,最后得到的结果就不一样了。

如下

这个程序执行两次后分别得到的结果

线程锁

为了应对那种情况的发生,我们引进了线程锁这个函数,要求cpu只能执行有这把锁的线程,其他线程想要运行,必须要等运行这把锁的线程运行完,下面的线程才能拿到锁并运行。

lock=threading.RLock()#创造同步锁

lock=threading.RLock()#创造递归锁

lock.acquire()#加锁

lock.release()#释放锁

类似案例

import threading
num=1
lock=threading.RLock()
def add():
    lock.acquire()
    global num
    for i in range(1,1000000):
        num+=i
    lock.release()
def redu():
    lock.acquire()
    global num
    for i in range(1,1000000):
        num-=i
    lock.release()
t1=threading.Thread(target=add)
t2=threading.Thread(target=redu)
t1.start()
t2.start()
t1.join()
t2.join()
print(num)

类似于药匙,一个旅馆,只有第一个线程拿到药匙才能进入运行,第二个线程想要进去运行就必须要等上一个线程运行完毕,拿到这个药匙再进去运行

结果

同步锁与递归锁的区别

同步锁只能申请锁,解除锁。

这个锁你不能申请两遍。

但是递归锁不同,你可以先申请一遍,没解开的情况下再申请一遍,之后两次解开退出。

死锁现象

有两种死锁

1.lock()锁,申请了两遍,第一次没释放就又申请了一遍,相当于这个线程需要申请这个锁才能往下走,但是呢他自己就拿了这个锁,还没释放,这里就申请不到,而申请不到就无法向下执行,相当于自己不自己卡住

2.两个线程需要两个锁,第一个锁两个不同,第二个锁是对方的第一个锁,但是又没释放,两个就相互卡住了。

多进程

多进程需要使用到multiprocessing这个库

创建进程并且使用的方法

其实说实话,跟创建多线程差不多。

import multiprocessing
def pnt(name):
    print("新进程{}帮我打印了这串字符".format(name))
if __name__=="__main__":
    f = multiprocessing.Process(target=pnt, args=('打印机',))
    f.start()

值得注意的是,创建进程我发现他必须在 if __name__=="__main__":下才能创建,否则报一个错误。

GIL锁

CPU的相关解释

python中,我们通常执行的计算操作是需要CPU的,而我们执行的io操作,比如下载图像视频文件增删呀啥的不怎么太需要CPU的

功能

在cpython解释器中(也就是我们平常用的解释器),当用到CPU时,GIL锁会阻止线程一起进入CPU,它只会允许一个线程进入CPU。但是他不会阻止进程进入CPU。

也就是说,我们执行下载任务,可以一个线程指定一个下载位置,他们都会直接进去网卡。

但是执行大的计算任务的时候,线程就只能一一进入了

对于开发的影响

因此,当我们在执行运算时,尽量使用多进程去操作,比如计算一些大的数据,在执行一些文件操作或者下载的时候,更偏向于使用线程去完成。

实际上,开发起来更加的灵活多变,因为进程是可以包含线程的。我们可以创建一些进程去计算,进程中也可以创建一些线程,去操作与这一部分计算有关的文件或者下载呀什么的。

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

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

相关文章

基于多反应堆的高并发服务器【C/C++/Reactor】(上)

(一)初始化服务器端用于监听的套接字 Server.h #pragma once // 初始化监听的套接字 int initListenFd(unsigned short port); Server.c int initListenFd(unsigned short port) {// 1.创建监听的fdint lfd socket(AF_INET, SOCK_STREAM, 0);if(lf…

HTTP:HTTP报文

HTTP:HTTP报文 1. 报文流1.1 报文流入源端服务器1.2 报文向下游流动1.3 报文的组成部分1.3.1 报文的语法1.3.2 起始行1. 请求行2. 响应行3. 方法4. 状态码 如果说HTTP是因特网的信使,那么HTTP报文就是用它来搬东西的包裹了。 1. 报文流 HTTP报文是在…

最新国内免费使用GPT4教程,GPT语音对话使用,Midjourney绘画

一、前言 ChatGPT3.5、GPT4.0、GPT语音对话、Midjourney绘画,相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容甚至也可以和用户进行创作交流。 然而,GP…

PHP字符串解析特性绕过WAF

[RoarCTF 2019]Easy Calc 题目的突破点: 只能传入数字和运算符号,不能传入字符(想办法绕过waf) 方法1. php解析规则:当php进行解析时,如果变量名前面有空格,php会自动去掉前面的空格再进行…

轻松搭建知识付费小程序:让知识传播更便捷

明理信息科技saas知识付费平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和维护…

打破Tomcat中的双亲委派机制:探讨与实践

目录 引言 1. 双亲委派机制概述 2. 打破双亲委派机制的场景 3. Tomcat中的类加载器体系 4. 打破双亲委派机制的方法 4.1 在catalina.properties中配置common.loader 4.2 在META-INF/context.xml中配置Loader元素 4.3 编写自定义的类加载器 5. 潜在的问题与解决方案 5…

Shell编程自动化之特殊Shell扩展变量

1.变量的处理 1.1 如果parameter变量值为空,那么返回str字符串。 ${parameter:-str} 1.2 如果parameter变量值为空,那么str替代变量值,且返回其值。 ${parameter:str} 1.3 如果parameter变量值为空,那么str当作stderr输出&am…

Django 简单图书管理系统

一、图书需求 1. 书籍book_index.html中有超链接:查看所有的书籍列表book_list.html页面 2. 书籍book_list.html中显示所有的书名,有超链接:查看本书籍详情book_detail.html(通过书籍ID)页面 3. 书籍book_detail.html中书的作者和出版社&…

现代雷达车载应用——第3章 MIMO雷达技术 3.2节 汽车MIMO雷达波形正交策略

经典著作,值得一读,英文原版下载链接【免费】ModernRadarforAutomotiveApplications资源-CSDN文库。 3.2 汽车MIMO雷达波形正交策略 基于MIMO雷达技术的汽车雷达虚拟阵列合成依赖于不同天线发射信号的可分离性。当不同天线的发射信号正交时&#x…

德人合科技 | 设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统

设计公司文件加密系统——天锐绿盾自动智能透明加密防泄密系统 PC端访问地址: www.drhchina.com 一、背景介绍 设计公司通常涉及到大量的创意作品、设计方案、客户资料等重要文件,这些文件往往包含公司的核心价值和商业机密。因此,如何确保…

百年东芝“瞄准”汽车「芯」机遇

在汽车“新四化”大变革的驱动下,汽车半导体市场进入需求暴涨的新周期。 “智能电动汽车所需要的半导体种类和数量正在急剧增加。” 东芝电子分立器件应用技术部经理成栋表示,东芝电子正在加大汽车半导体市场的布局,从而满足汽车电动化、智能…

[node]Node.js 中REPL简单介绍

[node]Node.js 中REPL简单介绍 什么是REPL为什么使用REPL如何使用REPL 命令REPL模式node的全局内容展示node全局所有模块查看全局模块具体内容其它命令 实践 什么是REPL Node.js REPL(Read Eval Print Loop:交互式解释器) 表示电脑的环境,类似 Windows 系统的终端或…

在x64上构建智能家居(home assistant)(二)(新版Debain12)连接Postgresql数据库

新版数据库安装基本和旧版相同,大部分可以参考旧版本在x64上构建智能家居(home assistant)(二)连接Postgresql数据库_homeassist 数据库-CSDN博客 新版本的home assistant系统安装,我在原来写的手顺上直接修改了,需要的可以查看在x64上构建智能家居(home…

vivado 主时钟分析

主时钟 主时钟是通过输入端口或千兆位进入设计的板时钟收发器输出引脚(例如恢复的时钟)。主时钟只能由create_clock命令定义。主时钟必须附加到网表对象。此网表对象表示中的点所有时钟边沿源自其并在时钟树上向下游传播的设计。换句话说,主…

深入理解 Rust 中的容器类型及其应用

Rust 作为一种系统编程语言,提供了丰富的容器类型来处理各种数据结构和算法。这些容器类型不仅支持基本的数据存储和访问,还提供了高效的内存管理和安全性保障。本文将详细介绍 Rust 中的几种主要容器类型,包括它们的用法、特点和适用场景&am…

使用 Taro 开发鸿蒙原生应用 —— 探秘适配鸿蒙 ArkTS 的工作原理

背景 在上一篇文章中,我们已经了解到华为即将发布的鸿蒙操作系统纯血版本——鸿蒙 Next,以及各个互联网厂商开展鸿蒙应用开发的消息。其中,Taro作为一个重要的前端开发框架,也积极适配鸿蒙的新一代语言框架 —— ArkTS。 本文将…

力扣每日一题day37[113.路径总和ii]

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

推荐一个vscode看着比较舒服的主题:Dark High Contrast

主题名称:Dark High Contrast (意思就是,黑色的,高反差的) 步骤:设置→Themes→Color Theme→Dark High Contrast 效果如下: 感觉这个颜色的看起来比较舒服。

jetbrains idea 报错 java.lang.ClassNotFoundException 之后自动搜索包导入包

-- 搜索类所在的包 导入包 搜索包 mac环境 pom中右键或者 cmdn

CSS:盒子模型

CSS:盒子模型 盒子模型盒子模型的组成盒子内容边框 border内边距 padding盒子实际大小计算CSS3的盒子类型content-boxborder-box 外边距 margin外边距合并相邻块元素垂直外边距合并嵌套块元素垂直外边距塌陷 行内元素的内外边距 盒子相关属性圆角边框盒子阴影 盒子模…