【发布时间】:2021-12-10 21:54:30
【问题描述】:
根据我在 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()的地方,我尝试使用几种方法来杀死一个线程,例如
- Raising exceptions and setting flags - 这些假设我已经在循环之外启动了我的线程,所以它没有可比性。
- Even this qn about looping threads assumes the thread isnt being looped
-
Killing using join or stop -
stop()不是我可以访问的选项。join()可用,但它不起作用,即在它被调用后,下一个线程 (PRINT #2) 继续打印。 - 其他建议使用 signals (1) (2) 的答案也无效。
- 在我的代码的不同部分使用 sys.exit() 或 break 也不会导致线程停止。
有什么方法可以让我轻松退出这样的循环线程吗?
注意:我需要使用线程而不是多处理。
【问题讨论】:
-
您的代码中涉及到相当多的手动操作,您能提取一个minimal reproducible example 吗?无论如何,在无限循环中启动线程似乎是个坏主意。
标签: python multithreading loops terminate