2012-02-14 89 views
0
def function(message): 

    if 'START' in message: 

    timer = 10 
    #start a thread which sleeps for 'timer' and prints "TIMER EXPIRED" 

    if 'STOP' in message: 

    #check if timer is still running, terminate thread if yes (print "TIMER STOPPED") 

def main(): 

    function('START') 

    time.sleep(random_time) 

    function('STOP') 

1,请建议什么样的线是最适合这个节目,thread.start_new_thread()似乎不具备退出()或终止()从主程序。选择性线程终止程序

2.how确保计时器仍在运行,然后终止thred

需要,因为使用线程工作,过程给出了一个错误,说新的进程是不能够使用变量从旧的,我其实调用其他函数而不是打印'TIMER EXPIRED'和'TIMER STOPPED'

回答

0

这里是用于停止在前面的函数调用中启动的线程的代码。 在第一次迭代,启动线程并通过参考(ⅰ使它全局变量)

全球T1,t1_stop

DEF timer_run(timer_val):

time.sleep(timer_val) 

DEF本功能():

global t1, t1_stop 

if 'START' in message: 

    timer_val =10 

    t1_stop = threading.Event() 

    t1 = threading.Thread(target=timer_run, args=(timer_val,)) 

    t1.start() 

if 'STOP' in message: 
    t1_stop.set() 

DEF主():

func('START') 

time.sleep(random_time) 

func('STOP') 
0

不要试图从主线程中终止一个工作线程,这可能很麻烦。最好允许工作线程从内部退出。因此,您应该考虑实现在主线程和工作线程之间传递消息的方法(提示:import Queue),然后传递一条消息,要求工作线程在您希望退出时自行终止。

顺便说一句,重写你的多进程代码为多线程不会简单地解决你能够在不同线程之间使用变量的问题。要编写线程安全代码,您需要使用消息队列在线程之间传递对象(这对于多处理来说也是同样可行的)。

+0

比混乱更糟糕(或者,因为我喜欢想象它,*更好* :),从外部终止线程是*不可能*。 Python不提供这样做的方法。离线程终止最近的事情是让线程通过销毁它的环境来引发异常,但是这不会影响被某个线程阻塞的线程(如'time.sleep()')。 – 2012-02-14 23:51:32

+0

@wim我从来没有用过Queue的目前我正在寻找一个更具体的答案,因为我没有更多的时间来解决这个问题 – 2012-02-14 23:54:00

+0

我无法告诉你如何一起修复一个快速修复,没有“修复”,因为上面的设计基本上被打破了。你不能在睡眠10秒时再次调用你的'function',因为它正忙着睡10秒.. – wim 2012-02-15 00:12:21