ad

《零基础Python 从入门到精通》_让你学得轻松_12.2 Python线程模块

admin 128 2023-10-25

【摘要】 本书摘自《零基础Python 从入门到精通》一书中第12章,第2节,编者是壹零快学。

12.2 Python线程模块

Python标准库中关于线程的主要是_thread和threading模块,本节主要详细讲解这两个模块的 使用。

12.2.1 _thread模块

标准库中的_thread模块作为低级别的模块存在, 一般不建议直接使用(从模块名字以“_”开头就可以看出官方并不希望我们直接使用),但在某些简单的场合也是可以使用的,因为_thread模块的使用方法十分简单。

《零基础Python 从入门到精通》_让你学得轻松_12.2 Python线程模块

标准库_thread模块的核心其实就是start_new_thread方法:

_thread.start_new_thread(function,args [,kwargs])

启动一个新线程并返回其标识符,线程使用参数列表args(必须是元组)执行函数,可选的 kwargs参数指定关键字参数的字典。当函数返回时,线程将以静默方式退出。当函数以未处理的异 常终止时,将打印堆栈跟踪,然后线程退出(但其他线程继续运行)。

动手写12.2.1

第 12 章 多线程与并行

执行结果如下:

Main thread start at 21:58:05

Thread 0 start at 21:58:05

Thread 0 sleeping

Thread 1 start at 21:58:06

Thread 1 sleeping

Thread 2 start at 21:58:07

Thread 2 sleeping

Thread 3 start at 21:58:08

Thread 3 sleeping

Thread 0 finish at 21:58:09

Thread 4 start at 21:58:09

Thread 4 sleeping

Thread 1 finish at 21:58:10

Thread 2 finish at 21:58:11

Thread 3 finish at 21:58:12

Thread 4 finish at 21:58:13

Main thread finish at 21:58:16

从执行结果可以看出, _thread模块的start_new_thread方法提供了简单的多线程机制,在单个线 程执行时,别的线程也在“同步”地执行。因为从执行结果可以发现,线程相继开始,并且根据线程内的sleep时间执行,没有占用其他线程的执行时间。

需要注意的是,虽然可以看出执行结果是“顺序”的,但是在实际情况中有可能会出现乱 序,并且执行结果也可能出现两行输出结果相叠的情况[我们可以在main函数中删除循环体内 的time.sleep(1)后多次运行查看结果]。这是多线程的一个特点,因为线程之间的调度是很难预 知的。

在主线程代码中添加time.sleep(6)的目的是让主线程不要执行完立马退出。主线程一旦运行 结束,其他线程无论是否执行完都会被强制退出。在这个例子中主线程使用time.sleep(6)来防止退 出,是因为我们已经知道线程将会执行4秒,但真实情况下要预估线程的实际执行时间可能并不容 易, 主线程过早或者过晚的退出都不是我们所期望的。这时候就需要使用线程锁,主线程可以在其他线程执行完之后立即退出。

_thread.allocate_lock方法返回一个Lock对象。Lock对象有三个常见的方法:acquire、release和 locked。acquire方法用于无条件地获取锁定Lock对象,如果有必要,等待它被另一个线程释放( 一

基 础 Python 从 入 门 到 精 通

次只有一个线程可以获取锁定,这就是它存在的作用);release方法用于释放锁,释放之前必须先 锁定,可以不在同一个线程中释放锁;locked方法用于返回锁的状态,如果已被某个线程锁定,则 返回True,否则返回False。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们 18664393530@aliyun.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:打开《Python入门与实战》_一步步学会Python_4.3 return 语句
下一篇:看《Excel人力资源管理实操全流程演练》如何教你做更好的表格_4.2 招聘成本表格设计
相关文章

 发表评论

暂时没有评论,来抢沙发吧~

×