Queue.Queue与多线程Python代码中的信号量,锁等

时间:2011-01-22 02:27:12

标签: python multithreading

  

主要挑战   多线程应用程序是   协调共享数据的线程   或其他资源。为此,   线程模块提供了许多   同步原语包括   锁,事件,条件变量,   和信号量。

     

虽然这些工具很强大,但很小   设计错误可能导致问题   难以复制的。所以,   任务的首选方法   协调是集中所有   访问单个资源   线程然后使用队列模块   用来自的请求提供该线程   其他线程。应用使用   Queue.Queue对象用于线程间   沟通和协调   更容易设计,更具可读性   更可靠。

它基本上表示使用Queue.Queue进行线程间通信和协调,而不是使用信号量,锁等功能强大的工具。

我的问题是,建议的方法有什么缺点?应该何时使用更强大的“强大工具”,为什么?

修改

要清楚,我知道信号量是什么。我只是想知道为什么Python文档建议使用Queue.Queue方法而不是“强大的工具” - 我只是使用文档自己的措辞,而不是我自己的。

2 个答案:

答案 0 :(得分:6)

我不确定我会考虑信号量并锁定“更强大的方法”,如你所知。

队列通常是高阶抽象。换句话说,您可以使用信号量和锁来构建线程安全的队列。

您在哪里使用取决于您的应用程序。队列适合在线程和进程之间传递“工作”,而信号量/锁定对于保护关键部分或共享资源很有用,因此一次只能访问一个线程。

答案 1 :(得分:1)

Take a look at the source code for Python's thread-safe queue。队列类从3个条件和一个Lock构建一个有用的抽象,正确

我不认为协调是最困难的问题。在共享状态多线程中,最难的是阻止线程“共享”。由于线程意外地共享和踩踏彼此的数据,你总是要注意非确定性行为。

所以,我建议你根本不使用线程。当您觉得没有足够的时间追踪heisenbug时,您应该使用较低级别的工具,但如果您有任何方法可以使用简单的队列,那就去吧。