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

机加工网站满足客户的分销管理系统

机加工网站,满足客户的分销管理系统,杭州房价暴跌已开始,做创意ppt网站有哪些前面的文章#xff0c;我们讲了什么Python的许多基础知识#xff0c;现在我们开始对Python并发编程进行学习。我们将探讨 Python 中线程和多线程的使用。帮助大家更好地理解如何使用这种技术。 目录 1. 线程#xff08;Threads#xff09; 1.1 Python 中的线程工作原理 …前面的文章我们讲了什么Python的许多基础知识现在我们开始对Python并发编程进行学习。我们将探讨 Python 中线程和多线程的使用。帮助大家更好地理解如何使用这种技术。 目录 1. 线程Threads 1.1 Python 中的线程工作原理 2. 创建和管理线程 2.1 创建线程 2.2 线程的生命周期和状态 2.3 线程同步和数据共享 3. 线程池ThreadPool 4. Python多线程编程 Python 多线程选择和注意事项 参考资料 总结 在编程中并发编程允许程序同时执行多个独立的任务这些任务可以在同一时间段内部分地重叠执行从而提高程序的效率和响应性。在Python 中并发编程可以通过多种方式实现其中包括线程Threads和进程Processes。 1. 线程Threads 学过操作系统的同学都知道线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中是进程中的实际运作单位。也即是说一个进程可以拥有多个线程这些线程共享进程的资源但每个线程拥有自己的执行堆栈和局部变量。相对于进程而言线程更加轻量级创建和销毁的开销更小。 1.1 Python 中的线程工作原理 Python 的标准库提供了 threading 模块来进行多线程编程。线程是由操作系统的线程实现来管理的这意味着 Python 的线程可以利用操作系统的多线程功能。 Python 的全局解释器锁Global Interpreter LockGIL是一个影响多线程执行的重要因素。GIL 实际上是一个互斥锁它确保了在解释器级别上同一时刻只有一个线程在执行 Python 字节码。也就是说在 CPU 密集型任务中多线程并不能充分利用多核处理器。但在 I/O 密集型任务中多线程可以提供更好的性能因为线程在等待 I/O 操作完成时可以让出 GIL。 线程的优势和限制 优势限制简单易用GIL 的影响共享内存线程安全适用于 I/O 密集型任务不适用于 CPU 密集型任务 2. 创建和管理线程 threading 模块可以轻松地创建和管理线程。学习线程的知识包括创建线程、启动和停止线程以及线程的生命周期和状态。下面我们一一介绍。 2.1 创建线程 首先让我们看一下如何使用 threading 模块创建线程。 import threading import timedef task(name, delay):print(fThread {name} is starting...)time.sleep(delay)print(fThread {name} is done.)# 创建线程 thread1 threading.Thread(targettask, args(Thread 1, 2)) thread2 threading.Thread(targettask, args(Thread 2, 1))# 启动线程 thread1.start() thread2.start()# 等待线程结束 thread1.join() thread2.join()print(All threads are done.)这里我们定义了一个 task 函数作为线程的执行函数接受线程的名称和延迟时间作为参数。然后我们创建了两个线程 thread1 和 thread2分别执行 task 函数并启动它们。最后我们等待所有线程执行完毕并输出 All threads are done.。 输出如下 Thread Thread 1 is starting... Thread Thread 2 is starting... Thread Thread 2 is done. Thread Thread 1 is done. All threads are done.2.2 线程的生命周期和状态 线程的生命周期包括创建、就绪、运行、阻塞和终止几个阶段。如下所示 ​ 上面的例子中我们通过 start() 方法启动了线程使其进入就绪状态然后线程调度器负责将其转换为运行状态执行 task 函数。当 task 函数中的 time.sleep(delay) 被调用时线程将进入阻塞状态等待一定时间后再次进入就绪状态直到任务完成。最后通过 join() 方法等待线程结束线程进入终止状态。 线程的状态可以通过 threading 模块中的常量来表示如下所示 状态描述相关常量创建创建线程对象但尚未启动threading.Thread就绪线程已启动等待被调度执行threading.Thread.start()运行线程正在执行代码threading.Thread.run()阻塞线程因等待 I/O 操作或其他事件而暂停执行-等待线程调用 wait() 方法进入等待状态-死亡线程执行完毕或因异常终止threading.Thread.is_alive()守护线程守护线程在主线程结束后自动退出threading.Thread.daemon 2.3 线程同步和数据共享 由于线程共享同一进程的内存空间可能会导致数据竞争和不确定的结果。为了确保线程安全我们需要使用同步机制来控制线程的访问。 使用锁Locks确保线程安全 锁是最简单、最常用的同步机制用于确保在任何时候只有一个线程可以访问共享资源。 import threading# 创建一个安全的计数器类 class SafeCounter:def __init__(self):self._value 0 # 初始化计数器值为0self._lock threading.Lock() # 创建一个线程锁对象# 线程安全地增加计数器值def increment(self):with self._lock: # 使用线程锁确保原子操作self._value 1# 线程安全地减少计数器值def decrement(self):with self._lock: # 使用线程锁确保原子操作self._value - 1# 线程安全地获取当前计数器的值def get_value(self):with self._lock: # 使用线程锁确保原子操作return self._value# 创建一个SafeCounter的实例 counter SafeCounter()# 定义一个工作函数每次增加计数器的值 def worker():for _ in range(100000): # 每个线程执行10万次增加操作counter.increment()threads [] # 创建10个线程来执行工作函数 for _ in range(10):t threading.Thread(targetworker) # 创建线程threads.append(t) # 将线程添加到列表中t.start() # 启动线程# 等待所有线程执行完毕 for t in threads:t.join()# 打印最终计数器的值 print(Final counter value:, counter.get_value())这里创建了一个 SafeCounter 类来实现线程安全的计数器。在 increment 和 decrement 方法中使用了 self._lock 来确保在修改计数器值时只有一个线程可以访问。get_value 方法也使用了同样的机制来获取计数器的值。 输出 Final counter value: 10000003. 线程池ThreadPool 线程池是一种资源池它预先创建了一组线程并将其维护在一个池中。当需要执行任务时可以从线程池中获取一个空闲线程来执行任务。任务完成后线程会被释放回线程池等待执行下一个任务。 Python 提供了 concurrent.futures 模块其中的 ThreadPoolExecutor 类可以用来创建线程池并方便地执行多个线程任务。 线程池有如下优点 优点描述提高效率可以避免频繁创建和销毁线程的开销提高线程的利用率。降低成本可以减少线程的上下文切换降低系统的开销。提高可控性可以方便地控制线程的数量和并发度提高程序的稳定性。 使用 concurrent.futures.ThreadPoolExecutor 创建线程池 从 Python 3.2 开始标准库中提供了 concurrent.futures 模块它提供了 ThreadPoolExecutor 类用于创建线程池。 from concurrent.futures import ThreadPoolExecutor# 创建线程池max_workers 参数指定线程池中最多可以同时运行的线程数 executor ThreadPoolExecutor(max_workers5)控制并发任务的数量 通过 max_workers 参数来控制线程池中最多可以同时运行的线程数。 # 创建线程池max_workers 参数设置为 2表示最多同时运行 2 个线程 executor ThreadPoolExecutor(max_workers2)示例使用线程池进行网络请求这里我们虽然只是简单的输出但后期我们将代码换成网络编程的代码就可以衔接了。 from concurrent.futures import ThreadPoolExecutor# 定义要访问的 URL 列表 urls [https://www.baidu.com, https://www.google.com, https://www.bing.com]# 创建线程池 executor ThreadPoolExecutor(max_workers3)# 定义要在线程中执行的函数 def print_message(message):print(message)# 提交任务到线程池 futures [executor.submit(print_message,url) for url in urls]# 等待所有任务完成 for future in futures:# 获取任务的执行结果response future.result()输出如下 https://www.baidu.com https://www.google.com https://www.bing.com4. Python多线程编程 多线程是指在一个程序中同时执行多个线程。线程是程序执行的基本单位它是操作系统调度的最小单位。 注意多线程可以提高程序的执行效率但同时也带来了线程安全问题。 对于 CPU 密集型任务可以考虑使用多线程提高程序的执行效率。 import time from concurrent.futures import ThreadPoolExecutor# 任务函数停止一秒并返回n*n def task(n):time.sleep(1)print(运算结果, n*n)return n * n# 单线程执行 start_time time.time() for i in range(10):result task(i) end_time time.time() print(单线程执行时间, end_time - start_time)# 多线程执行 start_time time.time()with ThreadPoolExecutor(max_workers5) as executor:futures [executor.submit(task, i) for i in range(10)]results [future.result() for future in futures] end_time time.time() print(多线程执行时间, end_time - start_time)下面来看输出情况 运算结果 0 运算结果 1 运算结果 4 运算结果 9 运算结果 16 运算结果 25 运算结果 36 运算结果 49 运算结果 64 运算结果 81 单线程执行时间 10.105695724487305 运算结果 16 运算结果 4 运算结果 9 运算结果 1 运算结果 0 运算结果 81 运算结果 64 运算结果 49 运算结果 36 运算结果 25 多线程执行时间 2.0349953174591064可以看到单线程执行时间远远高于多线程执行时间。这就是效率的极大提升。 Python 多线程选择和注意事项 问题最佳实践注意事项避免常见的线程安全问题* 使用锁Lock来控制对共享数据的访问。 * 使用条件变量Condition Variable来实现线程之间的同步。 * 使用无锁数据结构例如 concurrent.futures 模块中的 BoundedSemaphore。* 识别共享数据。 * 保护共享数据。 * 避免数据竞争。 * 测试线程安全性。如何设计线程安全的程序* 识别共享数据。 * 保护共享数据。 * 避免数据竞争。 * 测试线程安全性。* 不要过度使用多线程。 * 使用合适的线程池。 * 监控程序性能。在不同场景下选择合适的并发方案* CPU 密集型任务: 使用多线程可以提高程序的执行效率。 * I/O 密集型任务: 使用多线程可以提高程序的吞吐量。 * 混合型任务: 可以根据任务的不同特点选择使用多线程、多进程或其他并发方案。* 选择合适的并发方案取决于任务的类型和特点。 * 需要权衡并发方案的利弊。 参考资料 Python 官方文档 - threading: https://docs.python.org/3/library/threading.html 总结 关于线程和多线程的使用这里也讲得差不多了想必大家对线程和多线程的概念也有更深入的理解了。那么大家可以试试敲敲代码实际运行一番相信你会有所收获。 欢迎大家和我一起继续学习、记录python的下一个知识点。 如果感觉阅读对您还有些作用可以评论留言关注我。谢谢您的阅读 往期学习 Python安装教程版本3.8.10windows10 Linux系统安装Condaminiconda Conda快速安装的解决方法Mamba安装 VSCode安装教程版本1.87.0Windows10 Python基础语法从入门到精通的必备指南 Python的基本数据类型 Python数据类型间的转换隐式、显式 Python基础知识运算符详解 Python基础知识数字类型及数学函数详解- Python字符串操作及方法详解一篇就搞定 Python列表及其操作详解从此不再迷茫 Python元组Tuple深度解析 Python字典的使用技巧一篇详解 Python条件控制深度解析成为编程必备 Python循环语句全解析附实战演练 Python函数高效编程技巧提升你的代码效率 Python模块和包全解析一篇文章就够 Python lambda匿名函数一文详解 Python面向对象编程合集篇类、对象、封装、继承和多态 Python命名空间和作用域让你的代码逻辑更清晰 Python正则表达式初学者指南轻松上手 Python深入理解迭代器和生成器
http://www.pierceye.com/news/498109/

相关文章:

  • 建设银行网站短信错误6次wordpress个人淘客
  • 让网站快速收录最新集团公司网站案例
  • 网站开发公司长春高校 网站建设实施方案
  • 我做的网站打开慢怎么处理防控措施有这些优化
  • 网站的登录界面是怎么做的网站开发 职位
  • 西安英文网站制作企业年报申报入口官网
  • 做一网站多少钱企业官方网站建设教程
  • 自己建的网站能用吗海南网站建设哪家好
  • 网络公司网站模板html网站制作 数据库
  • 温州哪里有网站优化南通营销网站建设
  • 怎么在网站标头做图标wordpress 远程数据库
  • 厦门做手机网站公司最新常州网页制作招聘
  • 施工企业农民工工资专项检查报告百度seo怎么把关键词优化上去
  • 圆通速递我做网站sydney wordpress
  • 做外汇有哪些正规的网站做网站只用前端知识可以吗
  • 奢侈品购物网站排名微分销手机网站制作
  • 东莞市永铭装饰有限公司优质的seo快速排名优化
  • 大型网站服务器配置西宁网站设计建设
  • 网站怎么加ico网站模板上传到那个目录
  • dede关闭网站屯留做网站哪里好
  • 如何用python做网站脚本语言网络行为管理系统
  • 排名好的徐州网站建设微信里的小程序不见了
  • 常州公司网站建设网站基础建设ppt
  • 电商网站产品模块食品包装设计说明范文
  • WordPress的站内地图看网站的浏览器
  • 国外服装购物网站大全网站域名地址查询
  • 莆田专业网站建设公司价格九一制作厂网站app
  • 外贸网站怎么做会吸引眼球wordpress 律师事务所模板
  • 如何用代码制作网站最便宜网站建设
  • 苏州优化网站公司做编程网站有哪些内容