首页 > 解决方案 > 如何停止 python 中的线程,该线程本身在循环中被调用?

问题描述

根据我在 SO 上找到的其他类似答案,这似乎是一个特别令人困惑的问题。我有类似于以下的代码:

def parentFunction():
    # Other code
    while True:
        var1, var2 = anotherFunction1() # Getting client details after listening on open port
        threading.Thread(target = anotherFunction2, args=(var1, var2)).start()
        childFunction(var1,var2)
        print("PRINT #1: Running in Parent Function") # This only prints once for some reason

def childFunction(var1, var2):
    threading.Timer(10, childFunction, args=(var1,var2)).start()
    print("PRINT #2: Running in child function") # Prints every 10 seconds
    
    # Other code 

    if (someConditionIsMet):
        print("PRINT #3: Exiting") 
        end_process_and_exit_here()

所以基本上,当我运行时parentFunction(),我会进入一个永无止境的循环,每隔 10 秒,我的控制台就会打印"PRINT #2: Running in child function"。如果someConditionIsMet为真,我的控制台将打印“PRINT #3: Exiting”,但它不会退出。因此,我的循环将永远持续下去。我不确定它是否相关,但部分代码也有一个 Threading.Lock 。

在我end_process_and_exit_here()上面写的地方,我尝试使用几种方法来杀死一个线程,例如

  1. 引发异常和设置标志- 这些假设我已经在循环之外启动了我的线程,因此它不具有可比性。
  2. 即使这个关于循环线程的问题也假设线程没有被循环
  3. 使用加入或停止杀死-stop()不是我可以访问的选项。join()可用但它不起作用,即在它被调用后,下一个线程(PRINT #2)继续打印。
  4. 其他建议使用信号 (1) (2)的答案也不起作用。
  5. 在我的代码的不同部分使用 sys.exit() 或中断也不会导致线程停止。

有什么方法可以让我轻松退出这样的循环线程吗?

注意:我需要使用线程而不是多处理。

标签: pythonmultithreadingloopsterminate

解决方案


您可以使用python-worker,只需在函数上方添加 @worker pip install python-worker

from worker import worker

@worker
def anotherFunction2(var1,var2):
   # your code here
   pass

@worker
def parentFunction():
    # Other code
    while True:
        var1, var2 = anotherFunction1() # Getting client details after listening on open port
        function2Worker = anotherFunction2(var1,var2) # this will automatically run as thread since you put @worker above your function
        childFunction(var1,var2)
        print("PRINT #1: Running in Parent Function") # This only prints once for some reason

def childFunction(var1, var2):
    parentWorker = parentFunction(var1, var2)
    
    # Other code 

    if (someConditionIsMet):
        parentWorker.abort()

推荐阅读