繁体   English   中英

如何停止 python 中的线程,该线程本身在循环内被调用?

[英]How do I stop a thread in python which itself is being called inside a loop?

基于我在 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. 即使这个关于循环线程的 qn 也假设线程没有被循环
  3. 使用 join 或 stop 杀死- stop()不是我可以访问的选项。 join()可用但它不起作用,即在它被调用后,下一个线程( PRINT #2 )继续打印。
  4. 其他建议使用信号 (1) (2) 的答案也不起作用。
  5. 使用 sys.exit() 或在我的代码的不同部分中断也不会导致线程停止。

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

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

您可以使用python-worker ,只需在函数pip install python-worker上方添加 @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()

我不确定这是否是一种不好的做法(事实上,我觉得这可能是基于问题中链接的答案,说我们永远不应该“杀死线程”)。 我敢肯定这不是好事是有原因的,我很感激有人告诉我原因。 但是,最终对我.cancel()的解决方案是使用.cancel()

因此,第一个更改是将您的线程 Timer 分配给一个变量,而不是直接调用它。 因此,而不是threading.Timer(10, childFunction, args=(var1,var2)).start() ,它应该是

t = threading.Timer(10, childFunction, args=(var1,var2))
t.start()

随后,代替end_process_and_exit_here()你应该使用t.cancel() 这似乎有效并在进程中停止所有线程。 然而,不好的是它似乎并没有继续执行程序的其他部分。

暂无
暂无

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

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