【发布时间】:2015-07-21 14:20:59
【问题描述】:
我对 Python 中的多线程有相当基本的了解,并且对 asyncio 有更基本的了解。
我目前正在编写一个基于 Curses 的小型程序(最终将使用完整的 GUI,但这是另一回事),它在主线程中处理 UI 和用户 IO,然后有两个其他守护线程(每个使用他们自己的队列/worker-method-that-gets-things-from-a-queue):
-
watcher线程监视发生的基于时间和条件(例如,发布到留言板、收到的消息等)事件,然后将所需任务放入... - 另一个 (
worker) 守护线程的队列然后完成它们。
所有三个线程都在持续并发运行,这引出了一些问题:
- 当
worker线程的队列(或更一般地,任何线程的队列)为空时,是否应该停止它直到再次有事情要做,还是可以继续运行?并发线程除了查看队列之外什么都不做时会占用大量处理能力吗? - 是否应该合并两个线程的队列?由于
watcher线程持续运行单个方法,我猜worker线程将能够从watcher线程放入的单个队列中提取任务。 - 我认为这无关紧要,因为我不是多处理,但此设置是否受到 Python 的 GIL(我相信 3.4 中仍然存在)的影响?
-
watcher线程应该像这样连续运行吗?据我了解,如果我错了,请纠正我,asyncio应该用于基于事件的多线程,这似乎与我正在尝试做的事情有关。 - 主线程基本上总是在等待用户按键来访问菜单的不同部分。这似乎适合
asyncio的情况,但我也不确定。
谢谢!
【问题讨论】:
-
你是如何实现队列的?您使用
Queue模块和/或threading的同步原语,还是定期检查是否有数据需要处理? -
@Phillip 是的,我正在使用
threading锁——不知道Queue有同步原语。这是更好的方法吗? -
@velocirabbit
Queue模块提供线程安全队列。你绝对应该在你自己创建的任何东西上使用它。 -
@dano 哦,我肯定在使用
Queue——它有内置同步功能吗?那是不是就不用Queue和锁了? -
@velocirabbit 这完全取决于你如何使用
Queue,但如果你只是用它来将消息从生产者传递给消费者,你应该能够使用它没有任何外部锁定。您只需要确保在消费者方面坚持使用queue.get(),而不是在执行get之前检查Queue是否为空的某种循环。
标签: python multithreading python-asyncio