2015-05-14 28 views
1

Python线程模块没有实现真正的并行编程。线程相互切换。那么,信号量是否必要?信号量用于发送信号给其他应该同时处理的线程。我认为它只适用于多处理。为什么线程模块中的Semaphore类?python线程模块中信号量的需求

回答

0

因为你不能确定,当调度程序将切换线程。考虑SMP机器。它将一直处理一个线程。但是多线程代码应该使用信号量,互斥量,临界区和其他同步原语。

尽管CPython具有GIL并且一次不能执行多个线程,但可以有其他实现,但没有此限制。而且,即使GIL存在,从线程POV开始,所有的线程都在同时运行。你不能写出一些相反的代码(是的,你可以询问OS,但它是一个作弊行为)。

严格地说,信号量不用于向其他线程发送信号,而是用于保护对有限数量资源的访问。例如,您可以有5个打印机和10个要打印的线程。您将有一个Semaphore初始化值为5,它将保护您的打印机访问。所以在任何时候,不超过5个线程都会打印一些东西。

又如连接池。例如,你有N个到DB的连接池。这意味着不超过N个线程可以同时对数据库执行查询。在这种情况下,您将有Semaphore用N初始化。(N + 1)'线程将在Semaphore上阻塞并等待空闲连接。

+0

评论不用于扩展讨论;这个对话已经[转移到聊天](http://chat.stackoverflow.com/rooms/77824/discussion-on-answer-by-werewindle-the-need-of-semaphore-in-python-threading-mod) 。 – Taryn