import threading
import time
# This function gets called by our thread.. so it basically becomes the thread innit..
def wait_for_event(e):
while True:
print '\tTHREAD: This is the thread speaking, we are Waiting for event to start..'
event_is_set = e.wait()
print '\tTHREAD: WHOOOOOO HOOOO WE GOT A SIGNAL : %s', event_is_set
e.clear()
# Main code..
e = threading.Event()
t = threading.Thread(name='your_mum',
target=wait_for_event,
args=(e,))
t.start()
while True:
print 'MAIN LOOP: still in the main loop..'
time.sleep(4)
print 'MAIN LOOP: I just set the flag..'
e.set()
print 'MAIN LOOP: now Im gonna do some processing n shi-t'
time.sleep(4)
print 'MAIN LOOP: .. some more procesing im doing yeahhhh'
time.sleep(4)
print 'MAIN LOOP: ok ready, soon we will repeat the loop..'
time.sleep(2)
我自己也有同样的问题,直到找到答案。
我也做了一些速度测试,设置标志和采取行动的时间是愉快的快速0.00002秒在一个缓慢的2处理器Linux盒。
使用set()&clear()事件的线程暂停测试示例
Rich O'Regan著
你可以使用信号:http://docs.python.org/library/signal.html#signal.pause
为了避免使用信号,可以使用令牌传递系统。如果您想从主UI线程暂停它,您可能只需要使用Queue.Queue对象来与它通信。
只需弹出一条消息,告诉线程在队列中睡眠一定时间。
或者,您可以简单地从主UI线程连续地将令牌推送到队列中。工人应该每隔N秒(0.2或类似的)检查一次队列。当没有要出列的令牌时,工作线程将阻塞。当您希望它再次启动时,只需再次将令牌从主线程推送到队列上。
其他线程没有方法强制暂停某个线程(与其他线程终止该线程的方法相同),目标线程必须通过偶尔检查适当的“标志”来进行协作(对于暂停/取消暂停情况,
threading.Condition
可能是适当的)。如果您在一个unix-y平台上(基本上除了windows以外的任何平台),可以使用
multiprocessing
,而不是threading
--它的功能要强大得多,并且允许您向“另一个进程”发送信号;SIGSTOP应该无条件地暂停一个进程,然后SIGCONT继续它(如果您的进程需要在暂停之前做点什么,也可以考虑一下SIGTSTP信号,另一个进程可以捕获该信号以执行此类暂停前的任务。(可能有办法在窗户上获得同样的效果,但我对它们并不了解,如果有的话)。相关问题 更多 >
编程相关推荐