如何停止一个特定的线程?

问题描述 投票:1回答:1

我在一个项目中使用的线程是这样的。

thread1 = Thread(target=function, args=('x','y',1,2))

thread2 = Thread(target=function, args=('a','b',1,2))

thread1.start()

thread2.start()

一切正常,但我想在我的代码中增加一个选项。为了杀死我的线程,我目前在我的目标函数中使用While X==True,所以当我想杀死一个线程时,我必须传递While==False。所以当我想杀死一个线程时,我必须传递While==False.问题是这样做会杀死所有使用这个函数的线程。

所以,如果线程1和线程2同时运行并使用同一个目标函数,我如何才能只杀死线程1而不对线程2做同样的事情呢?

谢谢您

下面是一个简化的例子,说明我的实际操作。

def test_thread(freq): starttime=time.time() while RUN==True: try: if 1==1: print('1') sleep(freq - ((time.time() - starttime) % freq)) except Exception as Ex: print(Ex) pass

RUN = True
run_test = Thread(target=test_thread, args=(20))
run_test.start()
python-3.x multithreading python-multithreading
1个回答
1
投票

你可以给两个线程中的每个线程传递一个不同的、可变的对象作为参数。

class Stopper:
    def __init__(self):
        self.flag = True
    def ok_to_keep_going(self):
        return self.flag
    def stop_now(self):
        self.flag = False

def test_thread(freq, stopper):
    ...
    while stopper.ok_to_keep_going():
        ...

if __name__ == '__main__':
    t1_stopper = Stopper()
    t2_stopper = Stopper()
    t1 = Thread(target=test_thread, args=(T1_FREQ, t1_stopper))
    t2 = Thread(target=test_thread, args=(T2_FREQ, t2_stopper))
    t1.start()
    t2.start()

现在你可以通过调用 t1_stopper.stop_now(),或通过调用停止线程2 t2_stopper.stop_now()


或者,用更少的代码行。

def test_thread(freq, stopper):
    ...
    while stopper[0]:
        ...

if __name__ == '__main__':
    t1_stopper = [True]
    t2_stopper = [True]
    t1 = Thread(target=test_thread, args=(T1_FREQ, t1_stopper))
    t2 = Thread(target=test_thread, args=(T2_FREQ, t2_stopper))
    t1.start()
    t2.start()

现在你停止线程 t1 通过设置 t1_stopper[0]=False.

© www.soinside.com 2019 - 2024. All rights reserved.