在一段时间后停止线程

时间:2011-06-29 16:59:14

标签: python multithreading

我想在一段时间后终止一些线程。这些线程将运行无限循环,在此期间它们可以随机停留大量时间。线程的持续时间不能超过持续时间变量设置的时间。 如何在持续时间设置的长度之后,线程停止。

def main():
    t1 = threading.Thread(target=thread1, args=1)
    t2 = threading.Thread(target=thread2, args=2)

    time.sleep(duration)
    #the threads must be terminated after this sleep

3 个答案:

答案 0 :(得分:102)

如果您没有阻止 ,这将有效。

如果您正在计划睡眠,那么您必须使用该事件来进行睡眠。如果你利用这个事件来睡觉,如果有人告诉你在“睡觉”时停下来,它就会醒来。如果你使用time.sleep(),你的线程只会在唤醒之后停止

import threading
import time

duration = 2

def main():
    t1_stop = threading.Event()
    t1 = threading.Thread(target=thread1, args=(1, t1_stop))

    t2_stop = threading.Event()
    t2 = threading.Thread(target=thread2, args=(2, t2_stop))

    time.sleep(duration)
    # stops thread t2
    t2_stop.set()

def thread1(arg1, stop_event):
    while not stop_event.is_set():
        stop_event.wait(timeout=5)

def thread2(arg1, stop_event):
    while not stop_event.is_set():
        stop_event.wait(timeout=5)

答案 1 :(得分:10)

如果您希望线程在程序退出时停止(如您的示例所示),请将它们设为daemon threads

如果你希望线程在命令中死亡,那么你必须手动完成。有各种方法,但都涉及检查线程的循环以查看是否有时间退出(参见Nix的示例)。

答案 2 :(得分:0)

如果要使用课程:

from datetime import datetime,timedelta

class MyThread(): 

def __init__(self, name, timeLimit):        
    self.name = name
    self.timeLimit = timeLimit
def run(self): 
    # get the start time
    startTime = datetime.now()

    while True:
       # stop if the time limit is reached :
       if((datetime.now()-startTime)>self.timeLimit):
           break
       print('A')

mt = MyThread('aThread',timedelta(microseconds=20000))
mt.run()