Python数据分析与可视化:实战案例解析
128
2023-10-25
【摘要】 本书摘自《零基础Python 从入门到精通》一书中第12章,第2节,编者是壹零快学。
12.2 Python线程模块
Python标准库中关于线程的主要是_thread和threading模块,本节主要详细讲解这两个模块的 使用。
12.2.1 _thread模块
标准库中的_thread模块作为低级别的模块存在, 一般不建议直接使用(从模块名字以“_”开头就可以看出官方并不希望我们直接使用),但在某些简单的场合也是可以使用的,因为_thread模块的使用方法十分简单。
标准库_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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~