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

Python中线程和进程详解:从入门到高并发实战

目录一、进程与线程基础概念1.1 什么是进程1.2 什么是线程1.3 进程 vs 线程核心区别二、Python中的线程threading模块2.1 创建线程的两种方式2.2 线程同步锁Lock2.3 线程间通信queue.Queue2.4 线程池concurrent.futures.ThreadPoolExecutor2.5 GIL全局解释器锁Python线程的紧箍咒三、Python中的进程multiprocessing模块3.1 创建进程3.2 进程间通信IPC3.3 进程同步3.4 进程池Pool3.5 共享内存Value和Array四、线程 vs 进程如何选择4.1 任务类型决定一切4.2 实战案例对比五、高级主题与最佳实践5.1 协程轻量级并发5.2 多进程多线程混合架构5.3 性能对比:5.4 常见陷阱与避坑指南5.5 小结与注意事项六、总结一、进程与线程基础概念1.1 什么是进程进程Process是操作系统分配资源的最小单位是一个正在执行的程序实例。每个进程拥有独立的内存空间、文件描述符、数据栈等系统资源。打个比方进程就像一家独立的公司有自己的办公室、设备、员工与其他公司互不干扰。python import os print(f当前进程ID: {os.getpid()})1.2 什么是线程线程Thread是操作系统调度执行的最小单位是进程内的一个执行流。一个进程至少包含一个线程主线程多个线程共享进程的资源内存、文件等。线程就像公司里的员工共享公司的办公室、打印机但每个人负责不同的任务。python import threading print(f当前线程名: {threading.current_thread().name})1.3 进程 vs 线程核心区别对比维度进程线程资源占用独立内存开销大共享内存开销小创建销毁速度慢快比进程快10~100倍数据同步复杂需要IPC简单共享变量但需加锁健壮性一个进程崩溃不影响其他一个线程崩溃可能导致整个进程崩溃利用多核天然支持不同进程在不同核心Python中受GIL限制二、Python中的线程threading模块2.1 创建线程的两种方式方式一直接实例化Threadpython import threading import time def worker(name, delay): print(f线程 {name} 开始工作) time.sleep(delay) print(f线程 {name} 完成) # 创建线程 t1 threading.Thread(targetworker, args(A, 2)) t2 threading.Thread(targetworker, args(B, 1)) t1.start() t2.start() t1.join() # 等待线程结束 t2.join() print(所有线程执行完毕)方式二继承Thread类python class MyThread(threading.Thread): def __init__(self, name, delay): super().__init__() self.name name self.delay delay def run(self): print(f线程 {self.name} 开始) time.sleep(self.delay) print(f线程 {self.name} 结束) t MyThread(Worker, 2) t.start() t.join()2.2 线程同步锁Lock多个线程同时修改共享变量会导致竞态条件python counter 0 def unsafe_increment(): global counter for _ in range(100000): counter 1 # 不是原子操作 threads [threading.Thread(targetunsafe_increment) for _ in range(10)] for t in threads: t.start() for t in threads: t.join() print(f预期 1,000,000实际 {counter}) # 通常小于预期解决方案使用锁python lock threading.Lock() counter 0 def safe_increment(): global counter for _ in range(100000): with lock: # 上下文管理器自动获取和释放锁 counter 1 # 执行后 counter 正好等于 1,000,000其他同步原语RLock可重入锁、Semaphore信号量、Event事件、Condition条件变量。2.3 线程间通信queue.QueueQueue是线程安全的FIFO队列完美解决生产者-消费者问题python from queue import Queue import threading import random def producer(q, id): for i in range(3): item f产品_{id}_{i} q.put(item) print(f生产者{id} 生产 {item}) time.sleep(random.random()) def consumer(q, id): while True: item q.get() if item is None: # 终止信号 break print(f消费者{id} 消费 {item}) q.task_done() time.sleep(random.random()) q Queue(maxsize5) producers [threading.Thread(targetproducer, args(q, i)) for i in range(2)] consumers [threading.Thread(targetconsumer, args(q, i)) for i in range(3)] for t in producers consumers: t.start() for t in producers: t.join() # 发送终止信号 for _ in consumers: q.put(None) for t in consumers: t.join()2.4 线程池concurrent.futures.ThreadPoolExecutor手动管理大量线程很麻烦线程池复用线程提高效率python from concurrent.futures import ThreadPoolExecutor, as_completed def task(n): time.sleep(1) return n * n with ThreadPoolExecutor(max_workers5) as executor: futures [executor.submit(task, i) for i in range(10)] for future in as_completed(futures): print(f结果: {future.result()})2.5 GIL全局解释器锁Python线程的紧箍咒GIL是CPython解释器的一个互斥锁它确保同一时刻只有一个线程执行Python字节码。这意味着即使在多核CPU上Python的多线程也无法并行执行CPU密集型任务。python # CPU密集型计算多线程 vs 单线程 def cpu_heavy(n): while n 0: n - 1 # 单线程执行 start time.time() cpu_heavy(50_000_000) print(f单线程耗时: {time.time()-start:.2f}s) # 多线程执行4个线程各计算一半 t1 threading.Thread(targetcpu_heavy, args(25_000_000,)) t2 threading.Thread(targetcpu_heavy, args(25_000_000,)) start time.time() t1.start(); t2.start() t1.join(); t2.join() print(f2线程耗时: {time.time()-start:.2f}s) # 反而更慢因为GIL竞争GIL只影响CPU密集型任务对于I/O密集型网络请求、文件读写、数据库操作线程在I/O等待时会释放GIL多线程依然有效。三、Python中的进程multiprocessing模块3.1 创建进程multiprocessing绕过GIL每个进程有独立解释器真正利用多核。python from multiprocessing import Process import os def worker(name): print(f进程 {name} (PID{os.getpid()}) 开始工作) if __name__ __main__: p1 Process(targetworker, args(A,)) p2 Process(targetworker, args(B,)) p1.start(); p2.start() p1.join(); p2.join()注意Windows上必须将启动代码放在 if __name__ __main__: 内否则会无限递归创建进程。3.2 进程间通信IPC进程内存独立不能直接共享变量。multiprocessing提供多种IPC方式方式一Queuepython from multiprocessing import Process, Queue def producer(q): for i in range(5): q.put(f数据{i}) q.put(None) # 结束标志 def consumer(q): while True: item q.get() if item is None: break print(f消费: {item}) if __name__ __main__: q Queue() p1 Process(targetproducer, args(q,)) p2 Process(targetconsumer, args(q,)) p1.start(); p2.start() p1.join(); p2.join()方式二Pipe双向管道python from multiprocessing import Process, Pipe def worker(conn): conn.send(Hello from child) print(fChild received: {conn.recv()}) conn.close() if __name__ __main__: parent_conn, child_conn Pipe() p Process(targetworker, args(child_conn,)) p.start() print(fParent received: {parent_conn.recv()}) parent_conn.send(Hello from parent) p.join()方式三Manager共享复杂对象Manager可以创建代理对象让多个进程共享列表、字典等python from multiprocessing import Process, Manager def worker(shared_list, shared_dict, key, value): shared_list.append(key) shared_dict[key] value if __name__ __main__: with Manager() as manager: shared_list manager.list() shared_dict manager.dict() processes [Process(targetworker, args(shared_list, shared_dict, i, i*2)) for i in range(5)] for p in processes: p.start() for p in processes: p.join() print(f列表: {shared_list}) print(f字典: {shared_dict})3.3 进程同步与线程类似multiprocessing也提供Lock、Semaphore等防止多进程同时访问共享资源如文件、终端python from multiprocessing import Process, Lock def print_with_lock(lock, msg): with lock: print(msg) # 避免多个进程的输出交错 if __name__ __main__: lock Lock() ps [Process(targetprint_with_lock, args(lock, f来自进程{i})) for i in range(5)] for p in ps: p.start() for p in ps: p.join()3.4 进程池Pool创建大量进程开销大使用进程池复用进程python from multiprocessing import Pool def f(x): return x * x if __name__ __main__: with Pool(processes4) as pool: # map 方法 results pool.map(f, range(10)) print(results) # 异步方法 async_result pool.apply_async(f, (10,)) print(async_result.get())3.5 共享内存Value和Array对于简单数据类型可以使用共享内存比Manager快得多python from multiprocessing import Process, Value, Array def worker(val, arr): val.value 1 for i in range(len(arr)): arr[i] * 2 if __name__ __main__: num Value(i, 0) # i 表示有符号整数 arr Array(i, range(5)) # 整数数组 [0,1,2,3,4] p Process(targetworker, args(num, arr)) p.start() p.join() print(fnum {num.value}) # 1 print(farr {arr[:]}) # [0,2,4,6,8]四、线程 vs 进程如何选择4.1 任务类型决定一切任务类型推荐方案原因CPU密集型大量计算、图像处理、机器学习多进程绕过GIL真正并行利用多核I/O密集型网络爬虫、Web服务、文件读写多线程线程轻量切换开销小GIL影响小高并发Web服务协程 多进程异步IO 多核扩展4.2 实战案例对比案例1计算素数CPU密集型python # 计算0~N之间的素数个数 def count_primes(n): count 0 for i in range(2, n1): if all(i % j ! 0 for j in range(2, int(i**0.5)1)): count 1 return count # 多线程版 def threaded_version(): with ThreadPoolExecutor(max_workers4) as ex: futures [ex.submit(count_primes, 50000) for _ in range(4)] return sum(f.result() for f in futures) # 多进程版 def multiprocess_version(): with Pool(4) as p: results p.map(count_primes, [50000]*4) return sum(results) # 单线程版 def single_version(): return sum(count_primes(50000) for _ in range(4)) # 执行时间参考值 # 单线程: 8.2s # 多线程: 8.5s 甚至更慢 # 多进程: 2.3s 接近4倍提升案例2下载100个网页I/O密集型python import requests urls [https://httpbin.org/delay/1] * 100 # 模拟延迟 def download(url): return requests.get(url).status_code # 多线程版推荐 with ThreadPoolExecutor(max_workers20) as ex: results list(ex.map(download, urls)) # 约1.2秒 # 多进程版不推荐开销大 with Pool(20) as p: results p.map(download, urls) # 约1.5秒 进程创建开销 # 单线程版 results [download(url) for url in urls] # 约100秒五、高级主题与最佳实践5.1 协程轻量级并发当需要成千上万个并发任务时线程和进程都显得沉重。此时可用协程asyncio它在单线程内实现用户态调度开销极小。python import asyncio async def f.sleep(delay) # 模拟异步IO return data async def main(): tasks [fetch_data(i) for i in range(1000)] results await asyncio.gather(*tasks) print(len(results)) asyncio.run(main()) # 0.1秒内完成1000个任务推荐组合协程负责高并发网络请求多进程负责利用多核计算各司其职。5.2 多进程多线程混合架构典型的Web后端架构主进程负责管理多个工作进程每个工作进程内用线程池处理请求。python from multiprocessing import Process from concurrent.futures import ThreadPoolExecutor def worker_process(): with ThreadPoolExecutor(max_workers10) as executor: # 处理请求循环... pass if __name__ __main__: processes [Process(targetworker_process) for _ in range(4)] for p in processes: p.start() for p in processes: p.join()5.3 性能对比:以下代码对比单线程、多线程、多进程在CPU和I/O任务下的表现python import time import threading import multiprocessing as mp from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor # CPU密集型计算斐波那契数列 def fib(n): if n 1: return n return fib(n-1) fib(n-2) # I/O密集型模拟休眠 def io_task(duration): time.sleep(duration) return duration def benchmark(func, args, mode, workers4): start time.time() if mode thread: with ThreadPoolExecutor(workers) as ex: results list(ex.map(func, args)) elif mode process: with ProcessPoolExecutor(workers) as ex: results list(ex.map(func, args)) else: # single results [func(arg) for arg in args] elapsed time.time() - start return elapsed, results if __name__ __main__: # CPU密集型任务计算 fib(35) 4次 cpu_args [35] * 4 t_cpu_single, _ benchmark(fib, cpu_args, single) t_cpu_thread, _ benchmark(fib, cpu_args, thread, 4) t_cpu_process, _ benchmark(fib, cpu_args, process, 4) print(fCPU任务单线程 {t_cpu_single:.2f}s | 多线程 {t_cpu_thread:.2f}s | 多进程 {t_cpu_process:.2f}s) # I/O密集型任务sleep 0.5秒 20次 io_args [0.5] * 20 t_io_single, _ benchmark(io_task, io_args, single) t_io_thread, _ benchmark(io_task, io_args, thread, 10) t_io_process, _ benchmark(io_task, io_args, process, 10) print(fI/O任务单线程 {t_io_single:.2f}s | 多线程 {t_io_thread:.2f}s | 多进程 {t_io_process:.2f}s) # 输出 CPU任务单线程 12.34s | 多线程 12.89s | 多进程 3.45s I/O任务单线程 10.02s | 多线程 1.05s | 多进程 1.12s5.4 常见陷阱与避坑指南陷阱描述解决方案死锁线程A等锁B线程B等锁A统一锁顺序或使用try-finally超时机制虚假唤醒wait()可能无故返回始终在循环中检查条件进程启动慢Windows上spawn方式启动慢使用forkLinux或减少进程数量共享数据不一致多进程修改同一文件使用文件锁或multiprocessing.Lock内存爆炸进程池任务数据太大使用mmap或队列传递引用5.5 小结与注意事项I/O密集 首选ThreadPoolExecutor简单高效CPU密集 首选ProcessPoolExecutor接近线性加速需要共享大量状态使用Manager但注意性能瓶颈高并发网络使用asyncio aiohttp始终使用with管理锁和池避免资源泄漏注意不要在多线程中做CPU密集型计算不要为每个小任务创建新进程进程创建开销大不要在多个进程中频繁通过Manager传递大数据序列化开销不要忘记join()等待子进程/线程导致僵尸进程或主线程提前结束六、总结特性多线程多进程协程适用场景I/O密集型CPU密集型高并发I/O资源开销小MB级大独立内存极小KB级数据共享容易需加锁困难IPC容易单线程多核利用不可以受GIL限制可以不可以最大并发量数百~数千数十~数百数十万编程复杂度中注意锁高IPC管理中async/await建议CPU任务用进程IO任务用线程万级并发用协程混合场景灵活组合。

相关文章:

Python中线程和进程详解:从入门到高并发实战

目录 一、进程与线程:基础概念 1.1 什么是进程 1.2 什么是线程 1.3 进程 vs 线程:核心区别 二、Python中的线程(threading模块) 2.1 创建线程的两种方式 2.2 线程同步:锁(Lock) 2.3 线程…...

3分钟学会:无需电脑的iOS应用直装神器App-Installer终极指南

3分钟学会:无需电脑的iOS应用直装神器App-Installer终极指南 【免费下载链接】App-Installer On-device IPA installer 项目地址: https://gitcode.com/gh_mirrors/ap/App-Installer 还在为安装第三方iOS应用而烦恼吗?每次都要连接电脑、使用复杂…...

OpCore-Simplify:突破性自动化黑苹果配置工具,让OpenCore EFI生成从8小时缩短到30分钟

OpCore-Simplify:突破性自动化黑苹果配置工具,让OpenCore EFI生成从8小时缩短到30分钟 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simpli…...

Intel(R) Wireless-AC 9461适配器WLAN连接故障(错误代码10)的实用修复指南

1. 问题现象与初步排查 最近有不少用户反馈,使用Intel(R) Wireless-AC 9461无线网卡时突然无法连接WLAN网络,设备管理器中显示黄色感叹号,属性页面提示"该设备无法启动(代码10)"。这种情况通常发生在系统更新…...

MedGemma-X实战案例:如何用AI辅助完成日常放射科阅片工作

MedGemma-X实战案例:如何用AI辅助完成日常放射科阅片工作 1. 引言:当AI遇见放射科 在繁忙的放射科工作中,医生们每天需要解读数十甚至上百张影像。一张普通的胸部X光片,就包含了肺野、纵隔、肋骨、膈肌等多个需要评估的解剖结构…...

告别源码编译:在ARM服务器(如华为云鲲鹏)上快速部署GCC的三种‘懒人’方法

在ARM服务器上高效部署GCC的三大实战方案 当你在华为云鲲鹏或AWS Graviton等ARM架构服务器上搭建开发环境时,是否曾被繁琐的GCC源码编译过程困扰?本文将分享三种经过实战验证的快速部署方案,帮助你在aarch64架构的Linux系统中,用最…...

Anasys Workbanch实战解析:齿轮接触强度有限元分析全流程

1. 齿轮接触强度分析基础认知 刚接触有限元分析的新手工程师常会疑惑:为什么齿轮设计必须做接触强度分析?这个问题要从齿轮传动的实际工况说起。想象一下两个金属齿轮在高速啮合运转时,齿面接触区域实际上只有指甲盖大小的面积,却…...

解锁FNF-PsychEngine创作潜力:从核心功能到高级开发的完整指南

解锁FNF-PsychEngine创作潜力:从核心功能到高级开发的完整指南 【免费下载链接】FNF-PsychEngine Engine originally used on Mind Games mod 项目地址: https://gitcode.com/gh_mirrors/fn/FNF-PsychEngine FNF-PsychEngine是一款基于Haxe语言开发的开源节奏…...

3步实现AI动作迁移:如何让视频人物“学会“任何动作

3步实现AI动作迁移:如何让视频人物"学会"任何动作 【免费下载链接】ComfyUI-MimicMotionWrapper 项目地址: https://gitcode.com/gh_mirrors/co/ComfyUI-MimicMotionWrapper 想象这样一个场景:你拍摄了一段朋友的日常视频,…...

Kazumi插件高效管理全攻略:从安装到高级配置一步到位

Kazumi插件高效管理全攻略:从安装到高级配置一步到位 【免费下载链接】Kazumi 基于自定义规则的番剧采集APP,支持流媒体在线观看,支持弹幕,支持实时超分辨率。 项目地址: https://gitcode.com/gh_mirrors/ka/Kazumi Kazumi…...

利用Keepalived实现K8s Service高可用外部访问:externalIPs与VIP的完美结合

1. 为什么需要Kubernetes Service高可用外部访问? 在自建Kubernetes集群中,如何将服务暴露给外部访问一直是个头疼的问题。我刚开始接触K8s时,最常用的就是NodePort方式,但很快就发现它的致命缺陷——如果指定的节点宕机&#xff…...

CANoe.Diva CDD文件配置避坑指南:DTC导入、会话迁移与NRC设置详解

CANoe.Diva CDD文件高阶配置实战:从DTC陷阱到NRC优化的深度解析 当诊断测试用例在CANoe.Diva环境中频繁失败时,往往不是基础配置出错,而是那些隐藏在CDD文件深处的"高级选项"在作祟。本文将带您穿透表面配置,直击五个最…...

S3DIS点云数据集:室内场景语义分割的实战指南

1. S3DIS数据集简介与下载指南 S3DIS(Stanford Large-Scale 3D Indoor Spaces Dataset)是斯坦福大学发布的室内场景点云数据集,包含6个大型室内区域(Area_1至Area_6),总计271个房间场景。每个点云数据包含…...

数学公式恐惧症?用Python可视化理解雷诺运输定理

数学公式恐惧症?用Python可视化理解雷诺运输定理 第一次看到雷诺运输定理时,那些复杂的积分符号和偏微分表达式确实让人望而生畏。作为工程专业的学生,我们常常需要在流体力学、热传导等课程中应用这个定理,但传统的数学推导方式往…...

GPU显存稳定性终极检测:使用memtest_vulkan保障显卡健康

GPU显存稳定性终极检测:使用memtest_vulkan保障显卡健康 【免费下载链接】memtest_vulkan Vulkan compute tool for testing video memory stability 项目地址: https://gitcode.com/gh_mirrors/me/memtest_vulkan 显卡显存稳定性直接影响你的游戏体验、设计…...

别再乱插了!从USB鼠标到固态硬盘,一文搞懂电脑USB接口的‘家族树’

别再乱插了!从USB鼠标到固态硬盘,一文搞懂电脑USB接口的‘家族树’ 每次给电脑插USB设备时,你是否遇到过这些糟心事?新买的移动硬盘插上去毫无反应,键盘鼠标突然集体失灵,或者插满四个接口后打印机开始间歇…...

8通道高速数据采集方案对比:Xilinx ZU27DR的ADC/DAC性能实测报告

8通道高速数据采集方案对比:Xilinx ZU27DR的ADC/DAC性能实测报告 在当今高速数据采集领域,系统架构师们正面临着一个关键抉择:是继续采用传统分立式ADC/DAC方案,还是转向集成度更高的RFSoC解决方案?本文将基于Xilinx Z…...

BLE安全实战:从协议栈到应用层,构建防“降级”攻击的立体防御

1. BLE安全威胁与"降级攻击"的本质 当你用手机解锁智能门锁时,有没有想过蓝牙信号可能正在被隔壁楼的设备监听?2019年某知名智能锁被曝光的漏洞就是典型案例——攻击者通过伪造蓝牙MAC地址,诱使门锁将安全连接降级为不加密通信。这…...

Ubuntu下GDB调试QNX程序的5个常见坑及解决方法(AARCH64架构)

Ubuntu下GDB调试QNX程序的5个常见坑及解决方法(AARCH64架构) 调试AARCH64架构的QNX程序就像在迷宫中寻找出口——工具齐全却总有意料之外的障碍。作为在嵌入式领域深耕多年的开发者,我见过太多工程师在Ubuntu上用GDB调试QNX程序时陷入相同的困…...

智能台灯不止于调光:聊聊STM32如何实现坐姿提醒与用眼计时

智能台灯的健康革命:STM32实现坐姿监测与用眼管理的技术实践 当一盏台灯开始关心你的脊椎曲度和用眼健康时,智能硬件的价值才真正显现。在STM32微控制器的驱动下,现代智能台灯已经进化成能主动干预健康风险的"数字守护者"。不同于市…...

颠覆式采集:3步解锁百万级数据价值——TikTokCommentScraper开源方案全解析

颠覆式采集:3步解锁百万级数据价值——TikTokCommentScraper开源方案全解析 【免费下载链接】TikTokCommentScraper 项目地址: https://gitcode.com/gh_mirrors/ti/TikTokCommentScraper 在数字营销与用户研究领域,数据采集效率直接决定决策速度…...

微信小程序PC端兼容性实战:如何绕过限制在电脑上运行手机端小程序

微信小程序PC端兼容性实战:突破设备限制的技术方案 最近在开发一个需要适配PC端微信的微信小程序时,遇到了一个棘手的问题:部分功能在PC端无法正常使用。经过一番探索,我发现这背后涉及到小程序对运行环境的检测机制。本文将分享几…...

LabVIEW+OpenCV摄像头采集避坑指南:从USB摄像头到RTSP网络流,一个VI搞定所有参数设置

LabVIEW与OpenCV融合实战:打造高兼容性视频采集系统的7个关键策略 在工业自动化和机器视觉领域,稳定可靠的视频采集系统是许多项目的基石。LabVIEW作为图形化编程的标杆,与OpenCV这一计算机视觉库的强强联合,为开发者提供了高效解…...

从MPLS到Segment Routing:老网工的新选择,SR-MPLS迁移全指南

从MPLS到Segment Routing:老网工的新选择,SR-MPLS迁移全指南 当传统MPLS网络管理员第一次听说Segment Routing(SR)时,往往会有两种反应:要么是"这不过是另一种标签转发技术",要么是&q…...

GREAT-PVT周跳探测算法:从MW组合到电离层延迟处理的代码逻辑剖析

1. GREAT-PVT周跳探测算法概述 周跳探测是卫星导航定位中的关键技术难题。简单来说,当卫星信号被遮挡或干扰时,接收机可能会丢失对载波相位的连续跟踪,导致相位观测值出现整数倍的跳变,这种现象就称为周跳。打个比方,就…...

抖音智能采集工具:批量处理技术与合规应用指南

抖音智能采集工具:批量处理技术与合规应用指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback support. 抖音…...

AI辅助开发:利用快马多模型能力打造智能抖音版本分析引擎

最近在做一个抖音版本更新的智能分析系统,发现用传统方法处理海量更新日志实在太费劲了。正好试用了InsCode(快马)平台的多模型AI能力,整个过程变得特别高效。分享下我的实践心得: 语义理解与关键信息提取 抖音每次版本更新的说明文档动辄上千…...

quark-auto-save:自动化云存储管理的夸克网盘解决方案

quark-auto-save:自动化云存储管理的夸克网盘解决方案 【免费下载链接】quark_auto_save 夸克网盘签到、自动转存、命名整理、发推送提醒和刷新媒体库一条龙 项目地址: https://gitcode.com/gh_mirrors/qu/quark_auto_save 在数字化时代,云存储已…...

利用快马平台快速生成蓝桥杯python算法题原型,加速备赛效率

今天在准备蓝桥杯Python竞赛时,发现一个很实用的技巧——用InsCode(快马)平台快速生成算法题原型。就拿"三数之和"这道经典题来说,平台能帮我们快速搭建解题框架,特别适合赛前突击训练。 先说说这个题目的具体要求:给定…...

RePKG高效资源处理工具完全指南:从功能解析到实战应用

RePKG高效资源处理工具完全指南:从功能解析到实战应用 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg 功能探秘:RePKG如何解决游戏资源处理难题?…...