如何制作一个网站,广州网站制作企业,企业形象网站解决方案,源码网站怎么做学Python的漫画漫步进阶 -- 第十六步 十六、多线程16.1 线程相关的知识16.1.1 进程16.1.2 线程16.1.3 主线程 16.2 线程模块——threading16.3 创建子线程16.3.1 自定义函数实现线程体16.3.2 自定义线程类实现线程体 16.4 线程管理16.4.1 等待线程结束16.4.2 线程停止 16.5 动动… 学Python的漫画漫步进阶 -- 第十六步 十六、多线程16.1 线程相关的知识16.1.1 进程16.1.2 线程16.1.3 主线程 16.2 线程模块——threading16.3 创建子线程16.3.1 自定义函数实现线程体16.3.2 自定义线程类实现线程体 16.4 线程管理16.4.1 等待线程结束16.4.2 线程停止 16.5 动动手——下载图片示例16.6 练一练16.7 多线程总结全部16步学习完成 后续就是介绍项目实战请大家给予点赞、关注绝对超值 十六、多线程
如果想让我们的程序同时执行多个任务就需要使用多线程技术了。到目前为止我们编写的程序都是单线程的在运行时一次只能执行一个任务。
Python多线程是指从软件或者硬件上实现多个线程并发执行的技术。在多线程中一个程序可以划分为多个独立运行的线程也称为轻量级进程这些线程可以并行执行从而提高程序的执行效率。
多线程的优点在于可以充分利用多核CPU资源同时执行多个任务特别是在等待I/O操作如用户输入、文件读写和网络收发数据等时线程可以释放一些珍贵的资源如内存占用等。此外多线程还可以用于实现并发执行的任务如网络爬虫、文件批量处理等。
在Python中多线程相关的模块主要有Thread、Threading和Queue等。其中Thread是底层支持模块不建议使用。Threading模块对Thread模块进行了封装实现了线程的一些操作对象化。而Queue模块则实现了多生产者、多消费者的队列模式可以方便地在多线程中使用。
需要注意的是多线程编程也存在着一些问题。首先是线程安全问题如果多个线程同时访问共享数据可能会导致数据竞争或冲突的问题。其次是线程同步问题如果多个线程之间存在依赖关系需要按照一定的顺序执行就需要使用线程同步机制来确保正确地执行顺序。此外多线程的开销也比较大因为每个线程都需要分配和管理自己的栈空间等资源所以在实际应用中需要注意控制线程的数量和开销。
总之Python的多线程编程是一种有效的技术可以有效地提高程序的执行效率和响应速度。但是在实际应用中需要注意线程安全和线程同步等问题并合理控制线程的数量和开销。 16.1 线程相关的知识
本节先介绍线程相关的知识。
16.1.1 进程
一个进程就是一个正在执行的程序每一个进程都有自己独立的一块内存空间、一组系统资源。在进程的概念中每一个进程的内部数据和状态都是完全独立的。 在Windows操作系统中一个进程就是一个exe或者dll程序它们相互独立相互也可以通信。
16.1.2 线程
在一个进程中可以包含多个线程多个线程共享一块内存空间和一组系统资源。所以系统在各个线程之间切换时开销要比进程小得多正因如此线程被称为轻量级进程。
16.1.3 主线程
Python程序至少有一个线程这就是主线程程序在启动后由Python解释器负责创建主线程在程序结束后由Python解释器负责停止主线程。 在多线程中主线程负责其他线程的启动、挂起、停止等操作。其他线程被称为子线程。 16.2 线程模块——threading
Python官方提供的threading模块可以进行多线程编程。threading模块提供了多线程编程的高级API使用起来比较简单。 在threading模块中提供了线程类Thread还提供了很多线程相关的函数这些函数中常用的如下。 active_count返回当前处于活动状态的线程个数。
current_thread返回当前的Thread对象。
main_thread返回主线程对象。主线程是Python解释器启动的线程。示例代码如下
通过Python指令运行文件 16.3 创建子线程
创建一个可执行的子线程需要如下两个要素。
1 线程对象线程对象是threading模块的线程类Thread或Thread子类所创建的对象。
2 线程体线程体是子线程要执行的代码这些代码会被封装到一个函数中。子线程在启动后会执行线程体。实现线程体主要有以下两种方式。
1自定义函数实现线程体。
2自定义线程类实现线程体。
16.3.1 自定义函数实现线程体
创建线程Thread对象的构造方法如下 target参数指向线程体函数我们可以自定义该线程体函数通过name参数可以设置线程名如果省略这个参数则系统会为其分配一个名称args是为线程体函数提供的参数是一个元组类型。 示例代码如下 通过Python指令运行文件 16.3.2 自定义线程类实现线程体
另外一种实现线程体的方式是创建一个Thread子类并重写run方法run方法就是线程体函数。 采用自定义线程类重新实现16.3.1节的示例示例代码如下
16.4 线程管理
线程管理包括线程创建、线程启动、线程休眠、等待线程结束和线程停止其中线程创建、线程启动和线程休眠在16.3节已经用到了这些不再赘述。本节重点介绍等待线程结束和线程停止的内容。
16.4.1 等待线程结束
有时一个线程假设是主线程需要等待另外一个线程假设是t1子线程执行结束才能继续执行。 join方法的语法如下 参数timeout用于设置超时时间单位是秒。如果没有设置timeout则可以一直等待直到结束。 使用join方法的示例代码如下 通过Python指令运行文件 从运行结果来看在子线程t1结束后主线程才输出变量value的内容这说明主线程被阻塞了。 如果尝试将t1.join语句注释掉则输出结果如下 从运行结果可见子线程t1还没有结束主线程就输出变量value的内容了。 16.4.2 线程停止
在线程体结束时线程就停止了。但在某些业务比较复杂时会在线程体中执行一个“死循环”。线程体是否持续执行“死循环”是通过判断停止变量实现的“死循环”结束则线程体结束线程也就结束了。 另外在一般情况下死循环会执行线程任务然后休眠再执行再休眠直到结束循环。
示例代码如下 通过Python指令运行文件 16.5 动动手——下载图片示例 这个网络爬虫程序每隔一段时间都会执行一次下载图片任务在下载任务完成后休眠一段时间再执行。这样反复执行直到爬虫程序停止。 示例参考代码如下 本示例从服务器下载图片因此需要参考14.2节启动Web服务器 然后通过Python指令运行文件 16.6 练一练
1 请简述如何创建线程体。
2 请简述线程中join方法的作用。
3 下列哪些情况可以停止当前线程的运行 A.引发一个异常时。
B.当该线程调用sleep方法时。
C.当创建一个新线程时。
D.当该线程调用stop方法时。
4 判断对错请在括号内打√或×√表示正确×表示错误。 1线程对象是threading模块线程类Thread或Thread子类所创建的对象。
2实现线程体主要有以下两种方式自定义函数实现线程体和自定义线程类实现线程体。
3在线程体结束时可通过调用stop方法停止。
4在线程体结束时可通过调用join方法停止。
16.7 多线程总结
Python多线程是一种在程序中实现并发执行的技术它允许同时执行多个线程从而提高程序的运行效率。在Python中多线程编程可以使用threading模块或concurrent.futures模块来实现。下面是关于Python多线程的总结
多线程的概念和原理
多线程是指在一个程序中同时执行多个线程以充分利用多核CPU资源提高程序的运行效率。多线程的原理是将程序划分为多个子任务或线程每个线程并行执行从而加快程序的执行速度。在Python中多线程编程可以使用threading模块或concurrent.futures模块来实现。
线程的创建和管理
在Python中可以使用threading.Thread()方法来创建一个新线程。创建线程时需要传入一个可调用对象即线程要执行的任务作为参数。当线程被创建后可以调用start()方法来启动线程调用join()方法等待线程执行完毕以及调用is_alive()方法来判断线程是否仍在运行。
线程安全和线程同步
在多线程编程中需要注意线程安全和线程同步的问题。线程安全是指在多线程环境下数据访问不会出现冲突或竞争的情况。如果多个线程同时访问同一个数据就可能会出现数据竞争或冲突的问题。为了解决这个问题可以使用同步机制如互斥锁来确保在同一时间只有一个线程可以访问共享数据。
threading模块和concurrent.futures模块的比较
Python的threading模块是标准库中的多线程库使用起来比较简单但是它不支持异步执行和线程池的概念。相比之下concurrent.futures模块则提供了更强大的功能它支持异步执行和线程池的概念可以更好地管理多线程的执行。
多线程编程的适用场景
多线程编程适用于需要并发执行多个子任务的场景特别是当这些子任务之间没有依赖关系可以并行执行时。例如在一个网络爬虫程序中可以使用多线程同时爬取多个网页在一个文件下载程序中可以使用多线程同时下载多个文件。需要注意的是在某些情况下多线程并不一定能提高程序的性能因为线程的创建和管理也需要一定的时间和资源开销。因此在使用多线程编程时需要根据实际情况进行评估和优化。
注意事项
在多线程编程中需要注意以下几点
避免共享数据在使用多线程编程时应该尽量避免共享数据以避免出现数据竞争或冲突的问题。如果必须要共享数据应该使用同步机制来确保同一时间只有一个线程可以访问共享数据。注意线程的生命周期每个线程都有自己的生命周期包括创建、启动、运行和结束等阶段。在程序中管理好线程的生命周期避免出现死锁或其他问题。慎用全局变量在多线程编程中全局变量可能会导致线程不安全。如果必须要使用全局变量应该使用同步机制来保护全局变量的访问。选择合适的同步机制在多线程编程中选择合适的同步机制非常重要。例如可以使用互斥锁mutex或条件变量condition variable等同步机制来确保数据的正确性和一致性。
总之Python的多线程编程可以让程序实现并发执行多个子任务的目标从而提高程序的性能和响应速度。但是在使用多线程编程时需要注意线程安全和线程同步的问题以及选择合适的同步机制来保护共享数据的访问。 全部16步学习完成 后续就是介绍项目实战请大家给予点赞、关注绝对超值 附录
“练一练”参考答案
第1步 答案略
第2步 1 答案BCDF 2 答案BC 3 答案√ 4 答案略
第3步 1 答案ABCD 2 答案1×2√ 3 答案略
第4步 1 答案BD 2 答案BC 3 答案CD 4 答案B
第5步 1 答案略 2 答案B 3 答案D
第6步 答案1×2√ 3√ 4×
第7步 1 答案B 2 答案D 3 答案AD 4 答案1√ 2×3√ 4√
第8步 1 答案AB 2 答案ABC 3 答案global 4 答案1√ 2√
第9步 1 答案ABCD 2答案1√2√3√4√5×6√7×8× 3 答案略
第10步 1 参考答案AttributeError、OSError、IndexError、KeyError、NameError、TypeError和ValueError等。 2 答案B 3 答案1√ 2√ 3√ 4×5×
第11步 1 答案1-2 2-1 2答案1√2√3×4√5×
第12步 1 答案略 2答案1×2√3√4√5×6×7√8√
第13步 1 答案略 2 答案1√ 2×
第14步 1 答案略 2 答案略 3答案1√2√3√4√5×6√7√8√
第15步 1 答案略 2 答案BCD 3答案1√2√3√4√5×6×7√8√
第16步 1 答案略 2 答案略 3 答案AB 4答案1√2√3×4×