当前位置: 首页 > news >正文

Python教程:一文掌握Python多线程(很详细)

目录

1.什么是多线程?

1.1多线程与单线程的区别

1.2 Python 中的多线程实现方式

2.使用 threading 模块创建和管理线程

2.1创建线程:Thread 类的基本用法

2.2线程的启动和执行:start() 方法

2.3线程的同步和阻塞:join() 方法

2.4线程的名称和标识:name 和 ident 属性

3.线程间的通信与同步

3.1使用 Lock 实现线程同步

3.2使用 Queue 实现线程间通信

4.线程池的使用

5.理解全局解释器锁(GIL)对多线程的影响

5.1作用和原理:

5.2对多线程并发执行的限制:

6.多线程中的常见问题与解决方法

6.1死锁(Deadlock)的原因及避免方法:

6.2线程间数据共享与安全访问:

7.线程越多越好么?

8.面试问题:解析Python中的GIL(全局解释器锁)是什么?它如何影响多线程编程?

问题描述:

详细答案:

 9.多线程实战示例

9.1项目说明:

9.2完整代码示例:

9.3代码说明:


1.什么是多线程?


多线程是指在同一进程内同时运行多个线程,每个线程执行不同的任务,实现并发执行。每个线程都有自己的执行路径,可以独立运行和调度,共享进程的资源。

1.1多线程与单线程的区别

  • 单线程: 指在程序中只有一个执行线程,按照顺序依次执行任务。单线程模型简单直观,但无法充分利用多核处理器的性能。

  • 多线程: 可以同时执行多个线程,提高程序的响应速度和效率。多线程模型适用于需要同时处理多个任务或需要利用多核处理器的场景。

1.2 Python 中的多线程实现方式

Python 提供了 threading 模块来支持多线程编程。通过创建 Thread 对象并指定目标函数,可以实现线程的创建和管理。以下是一个简单的示例:

import threadingdef print_numbers():for i in range(1, 6):print(i)# 创建线程
t = threading.Thread(target=print_numbers)# 启动线程
t.start()# 主线程继续执行其他任务

2.使用 threading 模块创建和管理线程


2.1创建线程:Thread 类的基本用法

在 Python 中,可以使用 threading 模块中的 Thread 类来创建线程。以下是创建线程的基本用法:

import threadingdef my_function():print("This is a thread.")# 创建线程
my_thread = threading.Thread(target=my_function)

2.2线程的启动和执行:start() 方法

通过调用线程对象的 start() 方法来启动线程,让线程开始执行目标函数中的代码:

my_thread.start()

2.3线程的同步和阻塞:join() 方法

可以使用 join() 方法来等待线程执行完成,实现线程的同步和阻塞:

my_thread.join()
print("Thread has finished.")

2.4线程的名称和标识:name 和 ident 属性

每个线程都有一个名称和一个唯一的标识符。可以通过 name 属性获取线程的名称,通过 ident 属性获取线程的标识符:

print("Thread name:", my_thread.name)
print("Thread identifier:", my_thread.ident)

通过以上方法,可以创建、启动和管理线程,并实现线程间的同步和阻塞操作。线程的名称和标识符可以帮助我们对线程进行标识和跟踪,便于调试和管理多线程程序。

3.线程间的通信与同步


3.1使用 Lock 实现线程同步

在多线程编程中,为了避免多个线程同时访问共享资源导致数据混乱或不一致的问题,可以使用 Lock 对象实现线程同步。下面是一个简单的示例:

import threadingcounter = 0
lock = threading.Lock()def increment_counter():global counterwith lock:counter += 1# 创建多个线程并启动
threads = []
for _ in range(5):t = threading.Thread(target=increment_counter)t.start()threads.append(t)# 等待所有线程执行完成
for t in threads:t.join()print("Final counter value:", counter)

在上面的示例中,通过 Lock 对象确保了 counter 变量的原子性操作,避免了多线程同时修改导致的问题。

3.2使用 Queue 实现线程间通信

另一种常见的方式是使用 Queue 实现线程间的通信。Queue 是线程安全的数据结构,可以在多个线程之间安全地传递数据。以下是一个简单的示例:

import threading
import queuedef producer(q):for i in range(5):q.put(i)def consumer(q):while not q.empty():item = q.get()print("Consumed:", item)# 创建队列
q = queue.Queue()# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer, args=(q,))
consumer_thread = threading.Thread(target=consumer, args=(q))# 启动线程
producer_thread.start()
consumer_thread.start()# 等待线程执行完成
producer_thread.join()
consumer_thread.join()

在上面的示例中,通过 Queue 实现了生产者和消费者模式,生产者向队列中放入数据,消费者从队列中取出数据进行消费,实现了线程间的通信。

4.线程池的使用


使用 ThreadPoolExecutor 可以方便地管理线程池,控制线程数量并提交任务。以下是 ThreadPoolExecutor 的基本用法示例:

from concurrent.futures import ThreadPoolExecutor
import time# 定义一个任务函数
def task(n):print(f"Task {n} started")time.sleep(2)return f"Task {n} completed"# 创建 ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=3) as executor:  # 控制线程池大小为3# 提交任务给线程池future1 = executor.submit(task, 1)future2 = executor.submit(task, 2)future3 = executor.submit(task, 3)# 获取任务执行结果print(future1.result())print(future2.result())print(future3.result())

在上面的示例中,通过 ThreadPoolExecutor 创建了一个最大容纳3个线程的线程池。然后使用 submit() 方法提交了三个任务,并使用 result() 方法获取任务执行结果。

如果想要控制线程池的大小,可以将 max_workers 参数设置为所需的线程数量。通过 ThreadPoolExecutor 可以方便地管理线程池,提高多线程编程的效率。

5.理解全局解释器锁(GIL)对多线程的影响


全局解释器锁(GIL)是在 CPython 解释器中使用的一种机制,它对多线程并发执行产生了一定的限制和影响。以下是关于 GIL 的作用、原理以及对多线程并发执行的限制:

5.1作用和原理:

  • 作用: GIL 的作用是确保在解释器级别上,同一时刻只有一个线程可以执行 Python 字节码。这意味着在多核处理器上,Python 程序不能利用多个 CPU 核心同时执行线程。
  • 原理: 在 CPython 中,GIL 是由一个互斥锁来实现的。当一个线程获得了 GIL 后,其他线程就无法在同一时间执行 Python 字节码,直到持有 GIL 的线程释放锁。

5.2对多线程并发执行的限制:

  1. 性能影响: 由于同一时刻只有一个线程可以执行 Python 字节码,因此在多核 CPU 上,并发执行的效率受到限制。特别是对于计算密集型的多线程任务,GIL 可能导致性能瓶颈。
  2. IO 密集型任务的影响较小: 对于涉及大量 IO 操作的线程,GIL 的影响相对较小,因为在 IO 操作时,线程会主动释放 GIL,让其他线程执行。
  3. 影响解决方案: 为了充分利用多核 CPU,可以使用多进程、使用其他语言的扩展模块(如使用 C/C++ 编写的扩展模块)或者使用异步编程(如 asyncio)等方式来规避 GIL 的影响。

总之,GIL 的存在使得在 CPython 中的多线程并发执行受到了一定的限制,开发者需要根据具体情况选择合适的解决方案来充分利用多核 CPU 资源。

6.多线程中的常见问题与解决方法


当涉及到多线程编程中的常见问题如死锁(Deadlock)以及线程间数据共享与安全访问时,以下是代码示例和解释:

6.1死锁(Deadlock)的原因及避免方法:

原因: 死锁是指两个或多个线程互相等待对方释放资源而无法继续执行的情况。

避免方法: 避免死锁的一种常见方法是确保线程获取资源的顺序是一致的,或者使用超时机制来打破死锁。下面是一个简单的示例:

import threading# 创建两个锁
lock1 = threading.Lock()
lock2 = threading.Lock()def thread1():lock1.acquire()print("Thread 1 acquired lock 1")# 假设这里需要一段时间lock2.acquire()print("Thread 1 acquired lock 2")lock2.release()lock1.release()def thread2():lock2.acquire()print("Thread 2 acquired lock 2")# 假设这里需要一段时间lock1.acquire()print("Thread 2 acquired lock 1")lock1.release()lock2.release()t1 = threading.Thread(target=thread1)
t2 = threading.Thread(target=thread2)t1.start()
t2.start()t1.join()
t2.join()

在上述示例中,如果 thread1thread2 同时运行,由于它们试图以不同的顺序获取锁,可能导致死锁。为了避免死锁,可以尝试统一锁的获取顺序。

6.2线程间数据共享与安全访问:

在多线程编程中,线程之间共享数据时需要确保线程安全,可以使用互斥锁来保护共享资源。下面是一个简单的示例:

import threadingcounter = 0
lock = threading.Lock()def increment_counter():global counterfor _ in range(100000):lock.acquire()counter += 1lock.release()threads = []
for _ in range(10):t = threading.Thread(target=increment_counter)threads.append(t)for t in threads:t.start()for t in threads:t.join()print("Final counter value:", counter)

在这个示例中,我们使用互斥锁 lock 来确保对 counter 全局变量的安全访问。每个线程在增加 counter 值之前获取锁,操作完成后释放锁,从而避免竞态条件。这样可以确保线程安全地访问共享资源。

7.线程越多越好么?


在Python中使用多线程可以提高程序的并发性,但并不意味着线程越多越好。这是因为 Python 中的全局解释器锁(Global Interpreter Lock,GIL)限制了同一时间只有一个线程可以执行 Python 字节码,因此多线程并不能充分利用多核处理器的优势。

虽然多线程在某些场景下可以提高效率,比如I/O密集型任务,但如果是CPU密集型任务(如大量计算),多线程并不能有效提升性能。此外,线程数过多也会增加线程切换的开销,并可能导致系统资源竞争和调度开销,进而影响整体性能。

因此,在决定使用多线程时,需要考虑以下几点:

  1. 任务类型:针对不同类型的任务选择合适的并发模型,如I/O密集型任务可以考虑使用多线程,而CPU密集型任务可能更适合使用多进程。
  2. 平台和环境:要考虑程序运行的平台和环境对多线程的支持情况,以及是否受到 GIL 的影响。
  3. 系统资源:合理评估系统资源(CPU、内存等)的使用情况,避免过多线程导致资源浪费和性能下降。

综上所述,虽然多线程可以在适当的情况下提高程序的并发性和效率,但并不意味着线程越多越好。在实际应用中,需要根据具体情况慎重考虑线程数量,并结合任务类型、系统资源和性能需求进行合理的设计和调优。

8.面试问题:解析Python中的GIL(全局解释器锁)是什么?它如何影响多线程编程?


问题描述:

请解释 Python 中的 GIL 是什么,以及它如何影响多线程编程。同时,讨论在受 GIL 限制的情况下如何提高 Python 多线程程序的性能。

详细答案:
  • GIL 是什么?

    • GIL 是全局解释器锁(Global Interpreter Lock)的缩写,是 Python 解释器中的一个机制。它的作用是保证在解释器级别同一时刻只有一个线程执行 Python 字节码,从而防止多线程同时执行字节码导致的数据竞争和不一致性。
  • GIL 对多线程编程的影响:

    • 由于 GIL 的存在,Python 中的多线程无法利用多核处理器来实现真正的并行执行。即使有多个线程,它们依然是以串行的方式执行,因为同一时刻只有一个线程能够获取到 GIL。
  • 提高 Python 多线程程序性能的方法:

    • 使用多进程替代多线程: Python 中的多进程可以绕过 GIL 的限制,实现真正的并行执行。
    • 使用 C 扩展或 Cython: 将性能关键的部分使用 C 语言或 Cython 编写,可以减少对 GIL 的依赖,提高性能。
    • 使用异步编程: 使用异步编程库(如 asyncio、aiohttp)可以在不受 GIL 影响的情况下实现并发执行。

 9.多线程实战示例

当涉及到使用Python多线程的实际项目示例时,一个常见的场景是同时下载多个文件并将它们保存到本地。在这个示例中,我们将创建一个简单的多线程下载器,每个线程负责下载一个文件,并最后将它们保存到本地。

9.1项目说明:

我们将使用Python的threading模块来实现多线程下载器。每个线程将会下载一个文件,然后将文件保存到指定的目录。为了模拟真实下载过程,我们会使用一个虚拟的文件URL列表。

9.2完整代码示例:

import threading
import requests
import os# 虚拟文件URL列表
file_urls = ["https://www.example.com/file1.txt","https://www.example.com/file2.txt","https://www.example.com/file3.txt"
]# 下载函数
def download_file(url, save_path):response = requests.get(url)with open(save_path, 'wb') as file:file.write(response.content)print(f"Downloaded {url} and saved to {save_path}")# 下载器类
class DownloaderThread(threading.Thread):def __init__(self, url, save_path):threading.Thread.__init__(self)self.url = urlself.save_path = save_pathdef run(self):download_file(self.url, self.save_path)# 创建保存文件的目录
download_dir = "downloads"
os.makedirs(download_dir, exist_ok=True)# 创建并启动多个下载线程
threads = []
for i, url in enumerate(file_urls):file_name = f"file{i+1}.txt"save_path = os.path.join(download_dir, file_name)downloader = DownloaderThread(url, save_path)threads.append(downloader)downloader.start()# 等待所有线程完成下载
for thread in threads:thread.join()print("All downloads completed!")

9.3代码说明:

  1. 定义了一个download_file函数用于下载文件,并将其保存到本地。
  2. 创建了一个DownloaderThread类,继承自threading.Thread,用于表示下载线程。每个线程负责下载一个文件。
  3. 创建了一个download_dir目录用于保存下载的文件。
  4. 遍历虚拟文件URL列表,为每个文件创建一个下载线程,并启动下载。
  5. 最后等待所有线程完成下载,并打印提示信息。

通过这个示例,您可以看到如何使用Python多线程实现一个简单的文件下载器,同时了解了如何在实际项目中应用多线程进行并发处理。请注意,对于大规模文件下载或需要更复杂逻辑的情况,可能需要进一步优化和改进。

相关文章:

Python教程:一文掌握Python多线程(很详细)

目录 1.什么是多线程? 1.1多线程与单线程的区别 1.2 Python 中的多线程实现方式 2.使用 threading 模块创建和管理线程 2.1创建线程:Thread 类的基本用法 2.2线程的启动和执行:start() 方法 2.3线程的同步和阻塞:join() 方…...

华为防火墙配置指引超详细(包含安全配置部分)以USG6320为例

华为防火墙USG6320 华为防火墙USG6320是一款高性能、高可靠的下一代防火墙,适用于中小型企业、分支机构等场景。该防火墙支持多种安全功能,可以有效抵御网络攻击,保护网络安全。 目录 华为防火墙USG6320 1. 初始配置 2. 安全策略配置 3. 防火墙功能配置 4. 高可用性配…...

(含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现

原生写法 // 封装组件 import React, { useState, useRef } from react;const DraggableModal ({ children }) > {const [position, setPosition] useState({ x: 0, y: 0 });const modalRef useRef(null);const handleMouseDown (e) > {const modal modalRef.curre…...

选择最佳图像处理工具OpenCV、JAI、ImageJ、Thumbnailator和Graphics2D

文章目录 1、前言2、 图像处理工具效果对比2.1 Graphics2D实现2.2 Thumbnailator实现2.3 ImageJ实现2.4 JAI(Java Advanced Imaging)实现2.5 OpenCV实现 3、图像处理工具结果 1、前言 SVD(stable video diffusion)开放了图生视频的API,但是限…...

微信小程序版本更新检测

app.vue文件 <script>export default {onLaunch: function() {console.log(App Launch)// #ifdef MP-WEIXINthis.getUpdateManager();// #endif},methods: {// 检测小程序更新getUpdateManager() {const updateManager wx.getUpdateManager();updateManager.onCheckFor…...

【每日力扣】343. 整数拆分与63. 不同路径 II

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 343. 整数拆分 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使…...

洛谷 Cut Ribbon

思路&#xff1a;我们可以看出&#xff0c;这是一道完全背包问题&#xff0c;但是呢&#xff0c;有一点需要注意&#xff1a;那就是我们在装背包的时候并不能保证一定能装满背包&#xff0c;但是这里的背包要求是让我们装满的&#xff0c;所以我们需要判断这个背包装满才行&…...

#AS,idea,maven,gradle

Jdk,sdk。提前都是需要下好的。 Maven与gradle的思考&#xff1a; 用AS开发app时&#xff0c;gradle本就有&#xff0c;自己也可以指定&#xff0c;AGP同样。要注意gradle&#xff0c;AGP,jdk版本的事情。还有依赖库。 用idea开发网络程序时&#xff0c;也有内置的maven&…...

FPGA结构与片上资源

文章目录 0.总览1.可配置逻辑块CLB1.1 6输入查找表&#xff08;LUT6&#xff09;1.2 选择器&#xff08;MUX&#xff09;1.3 进位链&#xff08;Carry Chain&#xff09;1.4 触发器&#xff08;Flip-Flop&#xff09; 2.可编程I/O单元2.1 I/O物理级2.2 I/O逻辑级 3.布线资源4.其…...

【分布式】——分布式事务

分布式事务 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记链接&#x1f449;https://github.com/A-BigTree/tree-learning-notes ⭐⭐⭐⭐⭐⭐ Spring专栏&#x1f449;https://blog.csdn.net/weixin_53580595/category_12279588.html SpringMVC专…...

第6章:“让我们思考这个”的提示

“让我们思考这个”这一提示词&#xff0c;是深度对话的钥匙&#xff0c;鼓励ChatGPT生成反思性、沉思性的文本。 对于论文写作、诗歌创作或创意任务的完成&#xff0c;非常实用。 当你想要深究某主题时&#xff0c;只需向ChatGPT提问。 它会基于提示&#xff0c;结合算法和…...

安卓Activity上滑关闭效果实现

最近在做一个屏保功能&#xff0c;需要支持如图的上滑关闭功能。 因为屏保是可以左右滑动切换的&#xff0c;内部是一个viewpager 做这个效果的时候&#xff0c;关键就是要注意外层拦截触摸事件时&#xff0c;需要有条件的拦截&#xff0c;不能影响到内部viewpager的滑动处理…...

使用conda管理python环境

为什么需要管理环境&#xff1f; 每个python程序依赖的库版本可能不同&#xff0c;因此我们需要隔离不同的环境。 创建环境&#xff1a; conda create --name myenv python3.8这将创建一个名为myenv的新环境&#xff0c;并在其中安装Python 3.8版本。 列出所有环境&#xf…...

MR混合现实情景实训教学系统在军事演练课堂中的教学应用

MR混合现实情景实训教学系统在军事演练课堂中的教学应用具有以下优势&#xff1a; 1. 增强现实感&#xff1a;通过MR技术&#xff0c;学生可以在军事演练中更真实地感受到战场环境&#xff0c;增强他们的实战经验。 2. 提高训练效率&#xff1a;通过MR技术&#xff0c;可以模…...

vant checkbox 复选框 样式改写

修改前 修改后 基于 vant&#xff1a; 4.8.3 unocss: 0.53.4 <van-checkbox-group v-model"query.zczb" shape"square" class"text-16 w-100% flex flex-wrap"><template v-for"item in registerCapitalOption"><v…...

物联网实战--入门篇之(一)物联网概述

目录 一、前言 二、知识梳理 三、项目体验 四、项目分解 一、前言 近几年很多学校开设了物联网专业&#xff0c;但是确却地讲&#xff0c;物联网属于一个领域&#xff0c;包含了很多的专业或者说技能树&#xff0c;例如计算机、电子设计、传感器、单片机、网…...

将yolov5s部署到安卓上实战经验总结

最近需要在手机端实现一个目标检测的功能&#xff0c;于是选择了小巧又在目标检测方面表现很好的yolov5s&#xff0c;官网下载yolov5代码&#xff0c;用自己做的数据集进行了训练&#xff0c;然后把模型转换成torchscript格式&#xff0c;这些过程网上都有很多讲解&#xff0c;…...

算法日记————对顶堆(4道题)

对顶堆的作用主要在于动态维护第k大的数字&#xff0c;考虑使用两个优先队列&#xff0c;一个大9999999999根堆一个小根堆&#xff0c;小根堆维护大于等于第k大的数字的数&#xff0c;它的堆顶就是堆内最小&#xff0c;第k大的数字&#xff0c;另外一个大根堆维护小于等于k的数…...

【I.MX6ULL移植】Ubuntu-base根文件系统移植

1.下载Ubuntu16.04根文件系统 http://cdimage.ubuntu.com/ 1 2 3 4 5 2.解压ubuntu base 根文件系统 为了存放 ubuntu base 根文件系统&#xff0c;先在 PC 的 Ubuntu 系统中的 nfs 目录下创建一个名为 ubuntu_rootfs 的目录&#xff0c;命令如下&#xff1a; 【注意&…...

unity3d for web

时光噶然 一晃好多年过去了&#xff08;干了5年的u3d游戏&#xff09;&#xff0c;记得最后一次使用的版本好像是 unity 2017。 那个是 unity3d for webgl 还需要装个插件。用起来很蛋疼。 最近做一个小项目 在选择是用 Layabox 还是 cocosCreate 的时候 我想起了老战友 Uni…...

大宋咨询(深圳问卷调研)关于消费者研究的流程

消费者研究是一项至关重要的任务&#xff0c;它有助于企业了解目标市场的需求、偏好和行为&#xff0c;从而制定更加精准的营销策略。在执行消费者研究时&#xff0c;需要遵循一定的步骤和方法&#xff0c;以确保研究的准确性和有效性。开展消费者研究需要一系列的步骤和方法。…...

STM32看似无法唤醒的一种异常现象分析

1. 引言 STM32 G0 系列产品具有丰富的外设和强大的处理性能以及良好的低功耗特性&#xff0c;被广泛用于各类工业产品中&#xff0c;包括一些需要低功耗需求的应用。 2. 问题描述 用户使用 STM32G0B1 作为汽车多媒体音响控制器的控制芯片&#xff0c;用来作为收音机频道存贮…...

iOS - Runtime-isa详解(位域、union(共用体)、位运算)

文章目录 iOS - Runtime-isa详解&#xff08;位域、union&#xff08;共用体&#xff09;、位运算&#xff09;前言1. 位域介绍1.1 思路1.2 示例 - 结构体1.3 示例 - union&#xff08;共用体&#xff09;1.3.1 说明 1.4 结构体 对比 union&#xff08;共用体&#xff09; 2. a…...

使用VSCode搭建Vue 3开发环境

使用VSCode搭建Vue 3开发环境 Vue 3是一种流行的前端JavaScript框架,它提供了响应式的数据绑定和组合式的API。Visual Studio Code(VSCode)是一个轻量级但功能强大的源代码编辑器,支持多种语言开发。本文将引导您完成使用VSCode搭建Vue 3开发环境的步骤。 1. 下载和安装V…...

深度学习中的模型蒸馏技术:实现流程、作用及实践案例

在深度学习领域&#xff0c;模型压缩与部署是一项重要的研究课题&#xff0c;而模型蒸馏便是其中一种有效的方法。 模型蒸馏&#xff08;Model Distillation&#xff09;最初由Hinton等人在2015年提出&#xff0c;其核心思想是通过知识迁移的方式&#xff0c;将一个复杂的大模型…...

Java服务运行在Linux----维护常用命令

想起来哪些再添加上去 查看Java程序进程 jps -l 查出进程后根据pid 查询程序所在目录 pwdx 31313 根据端口查找PID 根据pid杀死程序 kill -p 31313 查看目录下所有包含9527的文件 grep -rn 9527 查看磁盘空间 查找文件名"nginx"文件或模糊查找"*nginx*&quo…...

夜晚水闸3D可视化:科技魔法点亮水利新纪元

在宁静的夜晚&#xff0c;当城市的霓虹灯逐渐暗淡&#xff0c;你是否曾想过&#xff0c;那些默默守护着城市安全的水闸&#xff0c;在科技的魔力下&#xff0c;正焕发出别样的光彩&#xff1f;今天&#xff0c;就让我们一起走进夜晚水闸3D模型&#xff0c;感受科技为水利带来的…...

从零开始的软件开发实战:互联网医院APP搭建详解

今天&#xff0c;笔者将以“从零开始的软件开发实战&#xff1a;互联网医院APP搭建详解”为主题&#xff0c;深入探讨互联网医院APP的开发过程和关键技术。 第一步&#xff1a;需求分析和规划 互联网医院APP的主要功能包括在线挂号、医生预约、医疗咨询、健康档案管理等。我们…...

【深度学习】YOLO检测器的发展历程

YOLO检测器的发展历程 YOLO&#xff08;You Only Look Once&#xff09;检测器是一种流行的实时对象检测系统&#xff0c;以其速度和准确性而闻名。自2016年首次推出以来&#xff0c;YOLO已经成为计算机视觉领域的一个重要里程碑。在本博客中&#xff0c;我们将探讨YOLO检测器…...

C语言--编译和链接

1.翻译环境 计算机能够执行二进制指令&#xff0c;我们的电脑不会直接执行C语言代码&#xff0c;编译器把代码转换成二进制的指令&#xff1b; 我们在VS上面写下printf("hello world");这行代码的时候&#xff0c;经过翻译环境&#xff0c;生成可执行的exe文件&…...

惠州微网站推广方案/2024年新冠疫情最新消息

mybatisMybatis集成ehcacheMybatis集成redis对比hibernate整合ehcache作为二级缓存导入ehcache配置ehcache.xml 配置缓存策略&#xff08;数据存活时间、间隔时间、最大缓存量、是否转存储到硬盘…&#xff09;在hibernate.cfg.xml或spring-hibernate.xml中开启二级缓存 开启二…...

wordpress 日本主题/企业网站制作要求

现在安卓手机基本上都配备了1300w像素&#xff0c;那么这个高的像素是不是只有在手机上拍照的功能呢&#xff1f;答案是否定的&#xff0c;这里教大家物尽其用&#xff0c;来弥补笔记本和usb摄像头的缺点。也就是在电脑上使用安卓手机的摄像头。从而在视频通话中使用。一、我们…...

网站都有备案号吗/游戏广告联盟平台

查询表内容&#xff1a; select * from stu; (stu是一张表) 显示表结构: desc stu;...

用dw个人网站怎么建立/yandex搜索入口

1.分页是按物理地址划分的&#xff0c;分段是按逻辑地址划分的。 2.页的大小固定不变&#xff0c;段的长度可变。 3.分页用户不可见&#xff0c;分段用户可见。 4.页内位移溢出时&#xff0c;会传给下一页。段内位移溢出时&#xff0c;就会出现越界中断。...

专业的网站建设商家/电商运营培训哪个机构好

一直以来就很热爱程序&#xff0c;记得在学校的时候虽然学了些C基础&#xff0c;但是跟本不会编译。傻傻的尝试把源文件的扩展名改为.exe .bat 结果当然是无功而返了。出来工作这么多年了&#xff0c;一直还是有这种对程序的热爱。只可惜自己确实不是这一行的啊&#xff01;&a…...

长春市网站制作/百度电脑版

描述 给一包含大写字母和整数(从 0 到 9)的字符串, 试写一函数返回有序的字母以及数字和. 样例 - 样例 1:输入 : str "AC2BEW3" 输出 : "ABCEW5" 说明 : 字母按字母表的顺序排列, 接着是整数的和(2 和 3)。解析 首先看了一下Java和Python的提交 Java…...