Python之线程介绍(3)
线程对象
Python 的线程模块还提供了更多原语。虽然上面的例子用不到这些,但它们可以在不同的场景中派上用场,所以熟悉一下它们还是很有用的。
Semaphore
首先是 Python 线程对象中的 threading.Semaphore。信号量 Semaphore 是一个具有某些特殊属性的计数器。首先,它的计数是原子的。这意味着可以保证操作系统在递增或递减计数器的过程中不会发生线程切换。
内部计数器会在调用 .release() 时递增,并在调用 .acquire() 时递减。
另一个属性是,如果一个线程在计数器为零时调用 .release(),该线程将阻塞,直到有另一个线程调用 .acquire() 并将计数器增加到1。
信号量 Semaphore 经常被用于保护容量有限的资源。例如,如果你有一个连接池,并希望连接池的大小限制为特定数量的情况。
Timer
threading.Timer 是一种延迟调度函数的方法。通过传递等待的秒数和将要调用的函数可以创建 Timer 对象:
你可以通过调用 .start() 来启动 Timer。该函数将在指定时间之后的某个时刻,在新线程上执行调用。但是注意,这不能保证在你想要的时间点精准地执行调用。
如果要停止已启动的计时器,可以通过调用 .cancel() 方法取消。Timer 触发后调用 .cancel() 方法不会执行任何操作,也不会产生异常。
计时器可用于在特定时间后提醒用户执行操作。如果用户在 Timer 到期之前执行了操作,则可以调用 .cancel() 取消定时。
Barrier
threading.Barrier 可用于保持固定数量的线程同步执行。创建 Barrier 时,调用者必须指定将在其上同步的线程数。每个线程在 Barrier 上调用 .wait()。它们都将保持阻塞状态,直到指定的线程进入等待态,然后全部同时释放。
记住,线程是操作系统调度的,因此即使同时释放所有线程,它们也会被安排为逐个运行。
Barrier 的一个功能是允许使用线程池初始化自身。在初始化之后让线程在 Barrier 上等待,可以确保在所有线程完成自身初始化之前没有线程开始运行。
总结:Python线程
你现在已经学习了 Python 线程提供的大部分内容,以及如何构建线程化应用程序并解决问题的许多示例。你还知道了编写和调试线程程序时可能出现的一些问题。
如果你想在 Python 中探索其他并发问题,请参考使用并发为你的Python开发提速。
如果你对深入了解 asyncio 模块感兴趣,可以阅读Python 异步IO:完整演练。
无论你做什么,你现在都有了使用 Python 编写程序所需的信息和信心。
英文原文:https://realpython.com/intro-to-python-threading/
译者:敦伟