【发布时间】:2016-06-13 15:35:49
【问题描述】:
我有一个带有一个主线程的 python 程序,假设有 2 个其他线程(或者甚至更多,可能没关系)。我想让主线程休眠,直到其他线程之一完成。轮询很容易做到(通过调用 t.join(1) 并为每个线程 t 等待一秒钟)。
是否可以不进行轮询,仅通过
SOMETHING_LIKE_JOIN(1, [t1, t2])
其中 t1 和 t2 是 threading.Thread 对象?该调用必须执行以下操作:休眠 1 秒,但在 t1、t2 之一完成后立即唤醒。与使用两个文件描述符的 POSIX select(2) 调用非常相似。
【问题讨论】:
-
可能是条件对象?主线程等待条件对象。 t1 和 t2 在返回之前调用 condition_obj.notify()。首先返回的线程唤醒主线程。这是Condition Object的文档:link
-
我在这里看到一个竞争条件:想象 t1 完成并调用“通知”,主线程唤醒,做一些事情并想再次进入睡眠状态(等待 t2、t3、t4 等)。可能发生在主线程“做一些事情”期间,部分甚至全部 t2,....t4 线程将完成它们的工作并调用“通知”。然后主线程会调用“wait”并永远休眠,因为再也没有人唤醒它了。
-
没有竞争条件。条件对象包含一个 RLock。稍后我会发布一个示例。
标签: python multithreading