主要挑战 多线程应用程序是 协调共享数据的线程 或其他资源。为此, 线程模块提供了许多 同步原语包括 锁,事件,条件变量, 和信号量。
虽然这些工具很强大,但很小 设计错误可能导致问题 难以复制的。所以, 任务的首选方法 协调是集中所有 访问单个资源 线程然后使用队列模块 用来自的请求提供该线程 其他线程。应用使用 Queue.Queue对象用于线程间 沟通和协调 更容易设计,更具可读性 更可靠。
它基本上表示使用Queue.Queue进行线程间通信和协调,而不是使用信号量,锁等功能强大的工具。
我的问题是,建议的方法有什么缺点?应该何时使用更强大的“强大工具”,为什么?
修改
要清楚,我知道信号量是什么。我只是想知道为什么Python文档建议使用Queue.Queue方法而不是“强大的工具” - 我只是使用文档自己的措辞,而不是我自己的。
答案 0 :(得分:6)
我不确定我会考虑信号量并锁定“更强大的方法”,如你所知。
队列通常是高阶抽象。换句话说,您可以使用信号量和锁来构建线程安全的队列。
您在哪里使用取决于您的应用程序。队列适合在线程和进程之间传递“工作”,而信号量/锁定对于保护关键部分或共享资源很有用,因此一次只能访问一个线程。
答案 1 :(得分:1)
Take a look at the source code for Python's thread-safe queue。队列类从3个条件和一个Lock构建一个有用的抽象,正确。
我不认为协调是最困难的问题。在共享状态多线程中,最难的是阻止线程“共享”。由于线程意外地共享和踩踏彼此的数据,你总是要注意非确定性行为。
所以,我建议你根本不使用线程。当您觉得没有足够的时间追踪heisenbug时,您应该使用较低级别的工具,但如果您有任何方法可以使用简单的队列,那就去吧。