繁体   English   中英

只运行一个线程实例

[英]Run only one Instance of a Thread

我对 Python 很陌生,对线程有疑问。

我有一个经常被调用的函数。 此函数在新线程中启动另一个函数。

def calledOften(id):
    t = threading.Thread(target=doit, args=(id))
    t.start()    

def doit(arg):
    while true:
    #Long running function that is using arg

每次创建新线程时调用 calledOften 。 我的目标是始终终止最后一个正在运行的线程 --> 在任何时候都应该只有一个正在运行的doit()函数。

我尝试过的: 如何在 Python 中停止循环线程?

def calledOften(id):
    t = threading.Thread(target=doit, args=(id,))
    t.start()
    time.sleep(5)
    t.do_run = False

这段代码(带有修改过的 doit 函数)让我在 5 秒后停止线程。 但我不能在开始新线程之前调用t.do_run = False ......这很明显,因为它没有定义......

有人知道如何停止最后一个正在运行的线程并启动一个新线程吗?

谢谢 ;)

我认为您可以自己决定何时从线程内部终止线程的执行。 这不应该给您带来任何问题。 您可以考虑使用线程管理器方法 - 如下所示

import threading


class DoIt(threading.Thread):
    def __init__(self, id, stop_flag):
        super().__init__()

        self.id = id
        self.stop_flag = stop_flag

    def run(self):
        while not self.stop_flag():
            pass  # do something


class CalledOftenManager:
    __stop_run = False
    __instance = None

    def _stop_flag(self):
        return CalledOftenManager.__stop_run

    def calledOften(self, id):
        if CalledOftenManager.__instance is not None:
            CalledOftenManager.__stop_run = True
            while CalledOftenManager.__instance.isAlive():
                pass  # wait for the thread to terminate

            CalledOftenManager.__stop_run = False
            CalledOftenManager.__instance = DoIt(id, CalledOftenManager._stop_flag)
            CalledOftenManager.__instance.start()


# Call Manager always
CalledOftenManager.calledOften(1)
CalledOftenManager.calledOften(2)
CalledOftenManager.calledOften(3)

现在,我在这里尝试的是制作一个用于调用线程DoIt的控制器。 它是实现您需要的一种方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM