【问题标题】:How to stop a specific Thread among others?如何停止特定的线程?
【发布时间】:2020-08-28 17:16:16
【问题描述】:

我正在为一个看起来像这样的项目使用线程:

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。 问题是这样做会杀死所有使用此函数的线程。

如果两个线程一起运行并使用相同的目标函数,我怎么能只杀死线程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()

【问题讨论】:

  • 您可以将不同的可变对象作为参数传递给两个线程中的每一个。让线程函数循环,直到给定对象的状态已更改。在主线程中更改一个对象的状态,但不更改另一个对象的状态。
  • 您好所罗门感谢您的回答。是的,我可以这样做,但我必须为每个线程创建一个函数,不是吗?使用 While Run_Thread1==True 的第一个函数和使用 While Run_Thread2==True 作为其不是变量的第二个函数?

标签: python-3.x multithreading python-multithreading


【解决方案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() 来停止线程1,或者通过调用t2_stopper.stop_now() 来停止线程2


或者,对于更少的代码行:

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_stopper[0]=False来停止线程t1

【讨论】:

  • 非常感谢你,我会试试这正是我想要的。我还在学习,所以这对我有很大帮助,肯定要了解更多关于 Class 和我不知道的 theta 的信息。
猜你喜欢
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
相关资源
最近更新 更多