python的多线程编程之锁

news2025/1/12 20:50:41

1、 背景概述

在上篇文章中,主要讲述了python中的socket编程的一些基本方面,但是缺少关于锁的相关概念,从而在这篇文章中进行补充。

由于在python中,存在了GIL,也就是全局解释器锁,从而在每次进行获得cpu的时候,同时只有一个线程获得了cpu的运行,在这个方面可以认为是线程安全的,但是在线程运行的时候,是共享内存的,共享相同的数据信息,从而这个时候python的线程就不那么安全了。

在python中,要保证数据的正确性,并且自己对数据进行控制,对数据进行加锁并且自己释放锁。

多线程的主要目的为了提高性能与速度,用在无关的方向是最好的,例如在使用爬虫的时候,可以使用多线程来进行爬取数据,因为在这些线程之间没有需要共同操作的数据,从而在这个时候利用是最好的。

如果需要操作同一份数据,那么必须自己保证数据的安全性。

如果需要利用多cpu的特性,那么应该使用的是多进程编程,而不是多线程编程,多进程编程为multiprocessing。

2、 利用锁进行同步相同的数据

直接看以下的代码:

#!/usr/bin/env python
import time
import threading

num = 0
class MyThread(threading.Thread):
    def run(self):
        #lock.acquire()
        #time.sleep(1)
        global num
        num += 1
        print self.name + 'set num to '+str(num)
        #lock.release()

#lock = threading.RLock()
threads = []
for i in range(10000):
    t = MyThread()
    threads.append(t)
for i in range(10000):
    threads[i].start()
for i in range(10000):
    threads[i].join()

看以上的代码,对全局变量进行一个修改,从而每个线程取到的是同一份的数据,从而,可能造成数据的计算结果不正确,从而需要用锁进行控制数据的正确性。

PS:在我的机器上进行运行的时候,都是正确的,从而看起来好像不用锁也可以,但是在有的机器上进行模拟的时候,最后的计算结果不正确。

在使用锁的时候,只要将注释的代码进行去掉即可使用锁。

3、 锁的类型

在python的threading模块中,提供了三种锁,如下所示:

在进行锁的操作的时候,必须在每个线程中,自己获取锁,然后自己释放锁,否则会造成一直在等待,也可以称之为死锁。

4、 事件

在进行多线程的时候,可以判断一个事件发生,然后触发做另外的事情,从而可以使用event,如下代码所示:

[root@python 523]# cat thread_demo.py 
#!/usr/bin/env python

import threading
import time
import Queue

def producter(name,queue,lock):
    event.clear()
    print '%s start to product...' % name
    queue.put('something')
    time.sleep(3)
    print 'product something'
    event.set()
    event.wait()

def consumer(name,queue,lock):
    print '%s start to consume...' % name
    event.wait()
    queue.get()
    print 'consume something'
    event.set()


lock = threading.Lock()
queue = Queue.Queue(10)
event = threading.Event()
threads = []
threadsc = []
for i in range(1):
    t = threading.Thread(target=producter,args=('kel%s' % i,queue,lock))
    threads.append(t)
for i in range(1):
    threads[i].start()
for i in range(1):
    t = threading.Thread(target=consumer,args=('smile%s' % i,queue,lock))
    threadsc.append(t)
for i in range(1):
    threadsc[i].start()


在使用event的时候,clear表示将flag设置为false,set表示设置为true,wait表示在false的时候,一直等待,从而当producter没有数据的时候,consumer一直在等待。

这种可以做事件的触发。

问题:

在进行此实验的时候,如果线程出现错误,那么是无法关闭的,从而只有杀掉进程才可以,从而可以使用命令如下:

killall python


杀掉进程的同时杀掉线程。(可以杀死进程,但是线程是无法杀掉的)

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

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

相关文章

网络通信--Linux

文章目录网络通信的基础通信模型IP地址和端口port网络套接字网络字节序初识UDP与TCP两种协议sockaddr结构体家族认识一些网络常用基础函数UDP实现简单通信TCP实现简单通信总结网络通信的基础 网络通信是建立在多层协议之下,最终利用数据传输线路进行数据通信。首先…

Web Spider案例 网洛克 第三题 AAEncode加密 练习(七)

声明 此次案例只为学习交流使用,抓包内容、敏感网址、数据接口均已做脱敏处理,切勿用于其他非法用途; 文章目录声明一、资源推荐二、逆向目标三、抓包分析 & 下断分析逆向3.1 抓包分析3.2 下断分析逆向拿到混淆JS代码3.3 AAEncode解决方…

【强烈建议收藏:MySQL面试必问系列之SQL语句执行专题】

一.知识回顾 之前的文章我们一起学习了MySQL面试必问系列之事务专题、锁专题,没有学习的小伙伴可以直接通过该链接地址直接访问,MYSQL你真的了解吗专栏的文章,接下来我们就一起来学习一下MySQL中SQL语句的执行流程,看看你掌握的怎…

csdn文章导航

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

Windows11安装Anaconda遇到的一些bug的【解决方案】

Windows11安装Anaconda遇到的一些bug的【解决方案】问题描述:CondaValueError: Malformed version string ~: invalid character(s)或者类似:CondaHTTPError解决思路:主要是换源的时候清华大学的路径不对,过时了。。。只需修改用户…

图数据库认证考试 NGCP 错题解析 vol.02:这 10 道题竟无一人全部答对

如果你读过「NebulaGraph 错题解析第一期」,大概知道在错题解析未出来之前,NebulaGraph 专业技能认证 NGCP(全称 NebulaGraph Certified Professional)的通过率仅有 16.7%。但是,经过上一轮 NebulaGraph 认证考试出题人…

EventGraph:Event Extraction as Semantic Graph Parsing 论文解读

EventGraph: Event Extraction as Semantic Graph Parsing 论文:2022.case-1.2.pdf (aclanthology.org) 代码:huiling-y/EventGraph (github.com) 期刊/会议:CASE 2022 摘要 事件抽取涉及到事件触发词和相应事件论元的检测和抽取。现有系…

黑盒测试重点复习内容

黑盒测试一、等价类划分边界值分析法二、判定表法一、等价类划分边界值分析法 对于各种输入或者输出,必须考虑等价类和边界值,并补充一些特殊值,如空值、空格、0、异常格式等特殊值。 基本概念: 有效等价类:满足需求…

K_A14_003 基于STM32等单片机驱动APDS9960手势运动模块 串口与OLED0.96双显示

K_A14_003 基于STM32等单片机驱动APDS9960手势运动模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明时序对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RCAPDS9960手势运动模块1.2、STM32F103C8T6APDS9960手势运动模块五、基础知识学习与相…

实例解析Java反射

反射是大多数语言里都必不不可少的组成部分,对象可以通过反射获取他的类,类可以通过反射拿到所有方法(包括私有),拿到的方法可以调用,总之通过“反射”,我们可以将Java这种静态语言附加上动态特…

【OpenCV】车牌自动识别算法的设计与实现

写目录一. 🦁 设计任务说明1.1 主要设计内容1.1.1 设计并实现车牌自动识别算法,基本功能要求1.1.2 参考资料1.1.3 参考界面布局1.2 开发该系统软件环境及使用的技术说明1.3 开发计划二. 🦁 系统设计2.1 功能分析2.1.1 车辆图像获取2.1.2 车牌…

研报精选230303

目录 【个股230303中泰证券_李子园】李子园:甜牛奶行业龙头,全国化加速推进中【行业230303中国银河】医药月报23or02:集采持续推进,控费仍是政策主基调【行业230303国联证券】银行行业专题研究:财富管理月报&#xff1…

征集令!寻找别出心裁的i.MX9352应用方案Demo

想要体验NXP全新的i.MX 9352这颗高性价比处理器吗?想要展示由你亲手打造的超炫酷的应用方案Demo吗?想要领取至高500元的京东E卡奖励吗?现在飞凌嵌入式全都给到你!面向全体工程师征集基于飞凌嵌入式OK-MX9352-C开发板设计的优质应用…

【Linux】Shell详解

😊😊作者简介😊😊 : 大家好,我是南瓜籽,一个在校大二学生,我将会持续分享Java相关知识。 🎉🎉个人主页🎉🎉 : 南瓜籽的主页…

Flutter Button 实例

大家好,我是 17。 在上篇文章 使用 Flutter Button 介绍了如何修改 button 的样式,本文来具体实践一下。 本文列举一些常用的 button 效果,以便在用到的时候方便使用。因为 ElevatedButton 最常用,所以大多以 ElevatedButton 举…

wifi 概率性自动断线(IpReachabilityMonitor)和 案例介绍

IpReachabilityMonitor机制,有时候会遇到用户反馈wifi 会概率性自动断线,最后发现是系统有开启IpReachabilityMonitor 机制,可能是在干扰严重环境下或相对弱信号下让系统误判导致下断线。 这篇博主写的非常好.wifi 概率性自动断线(IpReachabilityMonitor)_lost_provision…

Cesium+Vue3+vite 环境搭建(nvm安装使用),以及简单上手

目录 【nvm的安装和使用】 1、安装nvm 2、配置nvm 3、测试 一、Vite项目 1、创建一个新的Vite项目 解决问题:npm ERR! Unexpected token . 2、安装Cesium插件 3、项目配置 【1】在vite.config.js里进行配置 【2】清空style.css 【3】在App.vue里面进行全…

深度剖析指针(下)——“C”

各位CSDN的uu们你们好呀,今天小雅兰的内容还是我们的指针呀,上两篇博客我们基本上已经把知识点过了一遍,这篇博客就让小雅兰来带大家看一些和指针有关的题目吧,现在,就让我们进入指针的世界吧 复习: 数组和…

利用Albumentations工具包进行图像的数据增强(以yolo数据标注格式为例)

最近在看数据增强方法时,看到了这个有趣的工具包,研究了下并以yolo数据标注格式为例写了一个示例脚本。 该工具最大的好处是会根据你使用的数据增强方法自动修改标注框信息! import albumentations as A import cv2 import os""&…

【摄像头模块】口罩识别功能调试问题总结

文章目录一. 初始化二.程序烧录三.识别是否佩戴口罩小项目中常用到摄像头模块,文章内容疑问,可以私信交流 一. 初始化 1.初始界面为版本号,以及SD卡识别 如果未出现此界面,则可以按板子上的RST键,或者重新刷固件 …