我需要一个可以中止的sleep()
方法(如here或here)的方法。在
我的方法是让threading.Event.wait()
在指定的持续时间内超时:
def abortable_sleep(secs, abort_event):
abort_event.wait(timeout=secs)
abort_event.clear()
在调用abortable_sleep(10, _abort)
之后,我现在可以(从另一个线程)调用_event.set(_abort)
,让{
示例:
^{pr2}$输出:
0.000001 thread started
3.002668 thread stopped
0.000002 thread started
3.003014 thread stopped
0.000001 thread started
3.002928 thread stopped
0.000001 thread started
此代码按预期工作,但我仍有一些问题:
sleep()
哪一个可以中止?在Event
实例,它没有绑定到abortable_sleep()
的实例while True: abortable_sleep(0.0001)
,我是否必须预料到性能问题?wait()-timeout是如何实现的?在
我有一个包装类,它基本上在
Event
上添加一些睡眠语义。好在你只需要传递一个Sleep
对象,如果你愿意,你可以多次调用sleep()
(尽管sleep()
不是线程安全的),你可以从另一个线程wake()
。在使用示例:
^{pr2}$上面的结果可能是这样的:
完全是你所做的,只是封装在一个类中。在
由于比赛条件,您的解决方案并不总是完全正确的。您应该改用^{} 。创建后立即调用
aquire()
。当你想睡觉时,调用acquire()
并超时,如果acquire()
返回true,则调用release()
。要提前中止睡眠,请从另一个线程调用release()
;如果没有正在进行的睡眠,这将引发ValueError
。在如果另一个线程在错误的时间调用
set()
,那么使用一个事件是有问题的(即在您实际等待事件之外的任何时间)。在我会把sleep/abort函数打包到一个新的类中:
然后我还将提供一个
^{pr2}$Thread
子类来管理每个线程的唤醒例程的共享:任何其他可以访问此线程的线程都可以调用
wakeup()
来中止当前的abortable_sleep()
(如果有一个正在进行)。在使用ThreadWithWakeup
可以使用
ThreadWithWakeup
类创建线程,并按如下方式使用:其输出如下:
单独使用AbortableSleep
您也可以单独使用
AbortableSleep
类,如果出于某种原因不能使用ThreadWithWakeup
类(可能您在主线程中,可能有其他东西为您创建线程,等等),这很方便:相关问题 更多 >
编程相关推荐