线程——函数式创建线程threading模块,继承式创建线程,Lock对象解决多线程不安全问题,线程模型中的生产者消费者模式

news2024/11/17 3:39:16

调度程序内的多任务使用多进程,调度一个进程内的多任务使用多线程

在这里插入图片描述

函数式创建线程的方式threading模块

在这里插入图片描述
在Python中,创建线程主要依赖于threading模块
使用threading模块中的Thread类,你可以很容易地基于函数模式创建线程。基本步骤包括:

导入threading模块。
定义一个目标函数,这个函数将是线程执行的任务。
创建一个Thread对象,将目标函数作为参数传递给它。
调用Thread对象的start()方法来启动线程。

import threading  
import time  
  
# 定义一个简单的函数,这个函数将被线程执行  
def print_numbers():  
    for i in range(5):  
        time.sleep(1)  # 模拟耗时操作  
        print(i)  
  
# 创建Thread对象,将print_numbers作为目标函数  
thread1 = threading.Thread(target=print_numbers)  
  
# 启动线程  
thread1.start()  
  
# 主线程继续执行  
print("主线程继续执行")  
  
# 注意:如果主线程太快结束,可能不会看到子线程的输出。  
# 在实际应用中,你可能需要确保主线程等待子线程完成。  
# 例如,使用thread1.join()可以阻塞主线程直到thread1完成。  
  
# thread1.join()  # 如果需要等待线程完成,可以取消注释这行

多线程之间是并发执行的,执行顺序随机看cpu调度顺序

继承式创建线程的方式

在这里插入图片描述


进程之间的数据不能共享,线程之间的数据可以共享,进程之间数据如果需要共享需要用到队列

在这里插入图片描述
多个线程在操作global全局数据时候存在不安全问题,因为线程的执行是并行的,操作的数据又是共享的,有可能同时操作到同一个数据

在Python中,多线程编程时经常需要处理共享资源的问题,以避免数据竞争(race condition)和状态不一致等不安全的情况。为了安全地管理这些共享资源,可以使用threading模块中的Lock锁

在这里插入图片描述

import threading  
  
# 共享计数器  
counter = 0  
# 创建一个Lock对象  
lock = threading.Lock()  
  
def increment_counter():  
    global counter  
    for _ in range(100000):  
        # 在访问共享资源前加锁  
        lock.acquire()  
        try:  
            counter += 1  
        finally:  
            # 确保锁最终会被释放  
            lock.release()  
  
# 创建多个线程  
threads = []  
for _ in range(10):  
    t = threading.Thread(target=increment_counter)  
    threads.append(t)  
    t.start()  
  
# 等待所有线程完成  
for t in threads:  
    t.join()  
  
# 使用Lock后,最终结果应该是1000000  
print(f"Final counter: {counter}")

我们在 修改counter之前加上了锁(lock.acquire()),并在修改完成后释放锁(lock.release())。这样可以确保在任何给定时间,只有一个线程可以修改counter,从而避免了数据竞争,确保了程序的正确性。

使用try…finally语句块是为了确保即使在发生异常的情况下,锁也能被正确释放,防止死锁的发生。

生产者消费者模式

前边一则写过代码

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Linux | 文件描述符fd详解及重定向技术的应用

多谢梅花,伴我微吟。 - 《高阳台除夜》(韩疁) 2024.8.23 目录 1、文件描述符fd 文件操作符概念(简单带过) 重点:如何理解文件操作符使得系统实现了设备无关性?(使得操作系统无需关心具体的硬件细节) 示例代码:标准输入…

SAP BW:QUERY数据结果写入ADSO

作者 idan lian 如需转载备注出处 如果对你有帮助,请点赞收藏~~~ 需求背景 客户基于QUERY进行报表展示,现需迁移到永洪报表平台,query中的变量参数,公式等无法直接生成视图,query相对复杂,不想直接在视图…

流动会场:便捷、经济与声学效果的理想融合—轻空间

在现代活动策划中,选择合适的场地至关重要。流动会场作为一种新型移动空间,不仅具备便捷性和高性价比,还以其优异的声学效果,成为各类会议、展览、演出等活动的理想选择。 便捷安装,快速搭建 流动会场的模块化设计使其…

P-One如何测试一个场景集包含多个接口

P-One是泽众软件自主研发的一站式性能测试平台,集管理、设计、压测、监控以及分析于一体的全方位性能测试解决方案,适用于各种非功能测试场景:压力测试、负载测试、稳定性测试、可靠性测试、容量测试等。 在实际业务场景中,如电商…

springsecurity 在web中如何获取用户信息(后端/前端)

一、SecurityContextHolder 是什么 是一个安全的上下文对象,用于获取经过身份验证的用户。 二、SecurityContextHolder 是何时被创建的 当我们经过表单UsernamePasswordAuthenticationFilter 过滤器后,会回调父类的AbstractAuthenticationProcessingFilt…

华为自研仓颉编程语言测试版上线,计划持续到10月21号

现如今,编程语言作为构建软件世界的基石,其重要性不言而喻。 而华为,作为全球领先的信息与通信技术(ICT)解决方案提供商,其在技术创新上的每一步都备受瞩目。最近,华为再次成为焦点&#xff0c…

OpenCompass 评测 InternLM-1.8B 实践

1. 环境安装 conda create -n opencompass python3.10 conda activate opencompass conda install pytorch2.1.2 torchvision0.16.2 torchaudio2.1.2 pytorch-cuda12.1 -c pytorch -c nvidia -y# 注意:一定要先 cd /root cd /root git clone -b 0.2.4 https://gith…

系统编程-lvgl

带界面的MP3播放器 -- lvgl 目录 带界面的MP3播放器 -- lvgl 一、什么是lvgl? 二、简单使用lvgl 在工程中编写代码 实现带界面的mp3播放器 main.c events_init.c events_init.h 补充1:glob函数 补充2:atexit函数 一、什么是lvgl&a…

GPT-4、Claude 3 Opus 和 Gemini 1.0 Ultra 挑战控制工程的新领域

介绍 论文地址:https://arxiv.org/abs/2404.03647 近年来,GPT-4、Claude 3 Opus 和 Gemini 1.0 Ultra 等大规模语言模型(LLM)迅速发展,展示了它们解决复杂问题的能力。LLM 的这些发展在多个领域都有潜在的应用前景。…

Postman接口测试 —— 设置全局变量、参数传递、断言

在能熟练使用postman运行接口请求后,会遇到一些问题。例如: 我们的web网站一共有几十个接口,测试的时候如果要切换环境,这个时候要每个接口都要修改url的根路径,一个一个的改也太麻烦了; 还有时候我们经常…

八、SPA单页面实现SEO优化之预渲染prerender-spa-plugin

文章目录 一、前言二、prerender-spa-plugin预渲染方式实现SEO插件介绍实现步骤 一、前言 关于SPA和SEO优化、SSR服务器渲染的介绍可以参考这里: 六、什么是SEO优化(搜索引擎优化)?SPA单页面应用如何实现SEO优化? 通…

C/C++语言基础--字符串(包括字符串与字符数组、字符串与指针、字符串处理函数等),代码均可运行

本专栏目的 更新C/C的基础语法,包括C的一些新特性 前言 无论什么语言,字符串都是最重要、最基础的数据类型,他对二进制有很好的对应关系在C语言中没有提供专门的处理字符串的类型,但是我们可以通过字符数组、开辟内存地址来处理…

Content-Encoding: br

爬虫的时候遇到了 Content-Encoding: br , 这可能会导致返回的数据有乱码,无法解析,也无法解码, 浏览器显示编码 按照这么写,还是乱码 查了很久,需要在请求头 Accept-Encoding 将这个改为gzip&#xff0c…

Swift 6.0 如何更优雅的抛出和处理特定类型的错误

概述 从 Swift 语言诞生那天儿起,它就不厌其烦一遍又一遍地向秃头码农们诉说着自己的类型安全和高雅品味。 不过遗憾的是,作为 Swift 语言中错误处理这最为重要的一环却时常让小伙伴们不得要领、满腹狐疑。 在本篇博文中,您将学到如下内容&…

企业数字化转型会面临哪些挑战,如何解决?

当前,数字技术发展迅速,已迈入 AI 人工智能时代。企业若不进行数字化转型,可能会被用户抛弃、被竞争对手超越。那么,传统企业在转型过程中会遇到哪些挑战呢? 一、企业数字化转型面临的挑战 1、缺乏明确的战略规划和转…

宠物空气净化器除臭吗?性价比高的宠物空气净化器十大排名分享

来来来,先带大家一睹我店里的小可爱们 是不是超级可爱呀~?这样的大卡车猫猫,在我这猫咖里可是还有好几十只!作为一位坐拥几十只猫咪的“猫咖掌门”,朋友们总是投来羡慕的目光。但这份光鲜背后,可是有我无数…

轻松制作 GIF 动图,你也可以!

你是否曾为找不到合适的动图而烦恼? 是否羡慕别人能制作出精彩的 GIF 动图? 现在,无需再羡慕!因为我们用以下图片中的方法,你自己也能轻松制作 GIF 动图。 这款工具,操作简单易懂, 即使你没有…

舞动奇迹,亨廷顿舞蹈症患者专属健身秘籍!

🌈 在小红书的温馨角落里,让我们一起探索一个特别的世界——为亨廷顿舞蹈症(HD)患者量身定制的健身之旅。HD,这个名字或许带着一丝沉重,但它绝不能定义我们生活的全部色彩。通过科学的锻炼方式,…

APP逆向百例五-Flutter逆向案例----某次元(AES+RSA)

现在售价依旧是99¥,计划更新100案例,平均一个案例1块钱,要什么自行车! 还原一下我逆向此app的方法 1.抓包分析: 我这边用socksDroid抓不到数据包,但是小黄鸟可以,那就用Reqable结合电脑端进行抓包,不纠结…

Leetcode 347. 前 K 个高频元素

解法: 字典统计排序 class Solution:def topKFrequent(self, nums: List[int], k: int) -> List[int]:cont {}for eve in nums:if eve not in cont: cont[eve] 1else: cont[eve] 1contlist sorted(cont.items(), keylambda x: x[1])res [eve[0] for eve i…