湖南营销型网站建设流程网站图片延时加载

张小明 2026/1/12 11:13:31
湖南营销型网站建设流程,网站图片延时加载,怎么下载网页上的视频,网站建设方式优化大家好#xff0c;我是jobleap.cn的小九。 concurrent.futures 是 Python 标准库中用于简化并发编程的核心模块#xff0c;基于抽象的 Executor 类封装了 ThreadPoolExecutor#xff08;线程池#xff09;和 ProcessPoolExecutor#xff08;进程池#xff09;#xff0c…大家好我是jobleap.cn的小九。concurrent.futures 是 Python 标准库中用于简化并发编程的核心模块基于抽象的Executor类封装了ThreadPoolExecutor线程池和ProcessPoolExecutor进程池无需手动管理线程/进程的生命周期即可高效实现并行任务执行。本教程将全面拆解其所有常用 API通过连贯的代码示例串联核心用法并结合实战场景说明适用场景帮助你快速掌握并发编程的关键技巧。一、核心组件概述concurrent.futures 的核心是Executor抽象基类定义了并发执行任务的通用接口其子类适配不同的并发场景ThreadPoolExecutor基于线程的执行器适用于IO密集型任务如网络请求、文件读写、数据库操作受 GIL全局解释器锁限制无法真正并行执行CPU密集任务。ProcessPoolExecutor基于进程的执行器适用于CPU密集型任务如数值计算、数据处理通过多进程绕开 GIL实现真正的并行。二、常用 API 全解析串联式讲解我们从「创建执行器」到「任务管理」再到「资源释放」逐步拆解所有核心 API并通过连贯的代码示例展示用法。2.1 基础创建执行器构造方法构造执行器的核心参数决定了并发能力不同执行器的参数略有差异参数ThreadPoolExecutorProcessPoolExecutor说明max_workers可选默认min(32, CPU核心数4)可选默认CPU核心数最大工作线程/进程数thread_name_prefix可选不支持线程名前缀便于调试mp_context不支持可选多进程上下文如spawn/fork示例创建执行器importconcurrent.futuresimportosimportmultiprocessing# 1. 创建线程池thread_executorconcurrent.futures.ThreadPoolExecutor(max_workers5,# 最大5个工作线程thread_name_prefixdemo_thread_# 线程名前缀demo_thread_0、demo_thread_1...)# 2. 创建进程池Windows系统需指定spawn上下文process_executorconcurrent.futures.ProcessPoolExecutor(max_workersos.cpu_count(),# 按CPU核心数设置进程数mp_contextmultiprocessing.get_context(spawn))2.2 提交单个任务submit()submit(fn, *args, **kwargs)是提交单个异步任务的核心方法返回Future对象封装任务的执行状态、结果、异常。示例importtime# 定义基础任务函数模拟IO/CPU操作deftask(name,delay):简单任务延迟指定秒数后返回结果print(f任务{name}启动延迟{delay}秒)time.sleep(delay)# 模拟IO等待线程池适配场景print(f任务{name}完成)returnf任务{name}结果延迟{delay}秒# 提交任务到线程池future1thread_executor.submit(task,A,2)# 任务A延迟2秒future2thread_executor.submit(task,B,1)# 任务B延迟1秒# Future对象初始状态任务未完成print(f任务A是否完成{future1.done()})# 输出Falseprint(f任务B是否完成{future2.done()})# 输出False2.3 获取任务结果result()future.result(timeoutNone)阻塞等待任务完成并返回结果若指定timeout超时则抛出concurrent.futures.TimeoutError。示例接上文# 阻塞获取结果等待任务完成result1future1.result()# 等待任务A完成约2秒result2future2.result(timeout3)# 超时时间3秒足够完成print(f任务A结果{result1})# 输出任务 A 结果延迟 2 秒print(f任务B结果{result2})# 输出任务 B 结果延迟 1 秒# 任务完成后状态变为Trueprint(f任务A是否完成{future1.done()})# 输出True2.4 任务状态管理done() cancel()future.done()判断任务是否完成正常完成/异常/取消。future.cancel()尝试取消未开始执行的任务返回布尔值已启动则取消失败。示例# 提交一个排队的任务线程池满时任务会排队future3thread_executor.submit(task,C,5)# 尝试取消任务C若未启动则成功cancel_successfuture3.cancel()print(f取消任务C是否成功{cancel_success})# 线程池空闲则失败否则成功ifnotcancel_success:# 未取消则等待结果result3future3.result()print(f任务C结果{result3})else:print(任务C已取消)2.5 按完成顺序迭代任务as_completed()concurrent.futures.as_completed(fs, timeoutNone)返回迭代器按任务完成顺序生成Future对象先完成的先返回解决result()按提交顺序阻塞的问题。示例# 提交多个任务提交顺序3秒、1秒、2秒futures[thread_executor.submit(task,fTask-{i},i)foriin[3,1,2]]# 按完成顺序处理结果Task-1 → Task-2 → Task-3print(\n按完成顺序获取结果)forfutureinconcurrent.futures.as_completed(futures,timeout10):try:resultfuture.result()print(result)exceptExceptionase:print(f任务执行异常{e})2.6 批量执行任务map()executor.map(fn, *iterables, timeoutNone, chunksize1)批量提交任务类似内置map但异步执行返回迭代器按提交顺序返回结果即使后面任务先完成也会等待前面的。chunksize仅ProcessPoolExecutor分块处理迭代器减少进程间通信开销建议CPU密集任务设为1000。示例# 批量任务参数提交顺序D、E、Ftask_args[(D,1),(E,2),(F,3)]# 封装任务函数适配map的单参数输入deftask_wrapper(args):returntask(*args)# 批量提交并按提交顺序获取结果print(\n按提交顺序获取map结果)resultsthread_executor.map(task_wrapper,task_args,timeout10)forresultinresults:print(result)# 输出顺序D → E → F2.7 等待任务集合wait()concurrent.futures.wait(fs, timeoutNone, return_whenALL_COMPLETED)等待指定任务集合完成返回两个集合done已完成正常/异常/取消的任务。not_done未完成的任务。return_when可选值FIRST_COMPLETED任意一个任务完成即返回。FIRST_EXCEPTION任意一个任务抛异常即返回无异常则等全部完成。ALL_COMPLETED默认所有任务完成才返回。示例# 提交任务集合futures_wait[thread_executor.submit(task,fWait-{i},i)foriin[2,1,3]]# 等待第一个任务完成done,not_doneconcurrent.futures.wait(futures_wait,timeout5,return_whenconcurrent.futures.FIRST_COMPLETED)print(f\n完成的任务数{len(done)})# 输出1print(f未完成的任务数{len(not_done)})# 输出2# 处理已完成任务forfutureindone:print(f已完成任务结果{future.result()})# 等待剩余任务全部完成concurrent.futures.wait(not_done,return_whenconcurrent.futures.ALL_COMPLETED)2.8 释放资源shutdown()executor.shutdown(waitTrue, cancel_futuresFalse)关闭执行器释放线程/进程资源waitTrue默认阻塞等待所有已提交任务完成。cancel_futuresFalse默认若waitFalse是否取消未启动的任务Python 3.9 支持。最佳实践使用with语句自动调用shutdown()无需手动管理# with语句自动关闭执行器推荐print(\n使用with语句管理线程池)withconcurrent.futures.ThreadPoolExecutor(max_workers3)asexecutor:future4executor.submit(task,G,1)future5executor.submit(task,H,2)print(future4.result())print(future5.result())# 退出with块后executor自动shutdown释放资源三、异常处理任务内的异常不会立即抛出仅在调用result()/map()时触发需通过 try-except 捕获。示例# 定义抛异常的任务deferror_task():raiseValueError(任务执行出错)# 捕获单个任务异常withconcurrent.futures.ThreadPoolExecutor(max_workers1)asexecutor:future_errorexecutor.submit(error_task)try:future_error.result()exceptValueErrorase:print(f\n捕获任务异常{e})# 输出捕获任务异常任务执行出错# 捕获map批量任务异常deferror_map_task(x):ifx2:raiseRuntimeError(fx{x}执行失败)returnx*2withconcurrent.futures.ThreadPoolExecutor(max_workers2)asexecutor:try:resultsexecutor.map(error_map_task,[1,2,3])forresinresults:# 迭代时抛出异常print(res)exceptRuntimeErrorase:print(f\nmap任务异常{e})# 输出map任务异常x2 执行失败四、ThreadPoolExecutor vs ProcessPoolExecutor特性ThreadPoolExecutorProcessPoolExecutor底层实现线程进程GIL 影响受GIL限制CPU密集任务低效绕开GILCPU密集任务高效内存共享线程共享进程内存易数据竞争进程间内存隔离需IPC启动开销低高进程创建/销毁成本高适用场景IO密集爬虫、文件读写CPU密集计算、数据处理对比示例CPU密集任务# CPU密集任务计算斐波那契数deffib(n):ifn2:return1returnfib(n-1)fib(n-2)if__name____main__:# Windows进程池必须在main函数内执行importtime# 测试数据4个fib(35)任务fib_nums[35,35,35,35]# 1. 线程池执行低效starttime.time()withconcurrent.futures.ThreadPoolExecutor(max_workers4)asexecutor:executor.map(fib,fib_nums)print(f\n线程池执行时间{time.time()-start:.2f}秒)# 2. 进程池执行高效starttime.time()withconcurrent.futures.ProcessPoolExecutor(max_workers4)asexecutor:executor.map(fib,fib_nums)print(f进程池执行时间{time.time()-start:.2f}秒)结果进程池执行时间约为线程池的 1/4CPU核心数为4时。五、实战案例案例1线程池爬取网页IO密集importrequestsfromconcurrent.futuresimportThreadPoolExecutor,as_completed# 目标网址列表URLS[https://www.baidu.com,https://www.taobao.com,https://www.python.org,https://www.github.com]# 爬取单个网页deffetch_url(url):try:responserequests.get(url,timeout10)return{url:url,status:response.status_code,length:len(response.content)}exceptExceptionase:return{url:url,error:str(e)}if__name____main__:# 线程池爬取IO密集场景withThreadPoolExecutor(max_workers5)asexecutor:# 提交任务并映射URL与Futurefuture_to_url{executor.submit(fetch_url,url):urlforurlinURLS}# 按完成顺序输出结果forfutureinas_completed(future_to_url):urlfuture_to_url[future]resultfuture.result()iferrorinresult:print(f爬取{url}失败{result[error]})else:print(f爬取{url}成功状态码{result[status]}内容长度{result[length]})案例2进程池处理数据计算CPU密集importnumpyasnpfromconcurrent.futuresimportProcessPoolExecutor# CPU密集任务计算数组均值defcompute_mean(arr):returnnp.mean(arr)if__name____main__:# 生成10个大数组每个100万元素data[np.random.rand(1_000_000)for_inrange(10)]# 进程池并行计算withProcessPoolExecutor(max_workers4)asexecutor:meanslist(executor.map(compute_mean,data))# 输出结果print(\n各数组均值)fori,meaninenumerate(means):print(f数组{i1}{mean:.6f})六、注意事项GIL 限制ThreadPoolExecutor 仅适用于IO密集任务CPU密集任务必须用 ProcessPoolExecutor。资源释放务必通过with语句或shutdown()关闭执行器避免线程/进程泄漏。进程池约束Windows系统中进程池任务必须放在if __name__ __main__:内避免递归创建进程。任务粒度小任务如微秒级会导致调度开销大于执行开销需合并后提交。超时处理所有阻塞方法result()/as_completed()/wait()建议设置timeout避免无限阻塞。数据共享进程池无法共享内存需通过multiprocessing.Queue/Pipe实现进程间通信。总结concurrent.futures 是Python并发编程的高效工具核心用法可总结为选执行器IO密集用ThreadPoolExecutorCPU密集用ProcessPoolExecutor。提任务submit()提交单个任务返回Futuremap()批量提交按序返回结果。处理结果as_completed()按完成顺序迭代wait()批量等待任务状态。控资源优先用with语句自动管理执行器生命周期。掌握这些API和实战技巧即可快速实现Python程序的并发/并行执行大幅提升IO/CPU密集任务的执行效率。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

外贸网站设计多少钱网站建设步骤完整版

互联网大厂Java面试实战:严肃面试官VS搞笑程序员谢飞机的三轮技术对决 第一轮提问:基础技术栈与框架应用 面试官:谢飞机,你好!我们先从基础开始。你提到用过Spring Boot,那请说说Spring Boot的核心优势是什…

张小明 2025/12/29 5:30:06 网站建设

网站促销广告网站订票策划方案

WireMock终极指南:5个技巧快速掌握API模拟测试利器 【免费下载链接】wiremock 项目地址: https://gitcode.com/gh_mirrors/wir/wiremock 在当今微服务架构和前后端分离开发盛行的时代,API模拟测试已成为确保系统稳定性的关键环节。WireMock作为一…

张小明 2026/1/5 10:50:29 网站建设

扬中网站建设门户报价商标设计理念

FaceFusion开源协议解读:你可以用来做什么? 在数字内容爆炸式增长的今天,AI驱动的人脸编辑技术正以前所未有的速度渗透进我们的日常。从短视频平台上的“一键换脸”特效,到影视工业中高精度的演员替身合成,背后都离不开…

张小明 2025/12/29 9:50:08 网站建设

微网站设计企业用ps怎么做网站的效果图

第一章:为什么你的容器调度总失败?Docker Offload任务分配原理全剖析在复杂的微服务架构中,Docker容器调度失败是常见却难以根治的问题。其根源往往不在于镜像本身,而在于任务分配机制的底层逻辑未被充分理解。Docker的“offload”…

张小明 2026/1/9 18:05:36 网站建设

做电影网站怎样赚钱贵阳网站建设费用

前言: 继上一篇完成了 UDP 协议的复习后,最近梳理了 TCP 协议的底层实现。与 UDP “即发即忘”的特性不同,TCP 作为一种面向连接、可靠的字节流协议,虽然握手和挥手的过程增加了复杂性,但它是构建稳定网络服务&#xf…

张小明 2025/12/29 9:03:58 网站建设

网站设计总结与心得体会网站建设低价建站损失在哪里

AtomGit Pocket 新手入门教程 教程略有修改GitCode-AtomGit,但功能实现是一样的 本教程将指导完全没有编程经验的新手如何使用 AtomGit Pocket 应用。AtomGit Pocket 是一个基于 ArkUI-X 框架开发的跨平台移动应用,原生支持 HarmonyOS,可以…

张小明 2026/1/6 2:57:30 网站建设