python - 如何停止 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()
上面写的地方,我尝试使用几种方法来杀死一个线程,例如
- 引发异常和设置标志- 这些假设我已经在循环之外启动了我的线程,因此它不具有可比性。
- 即使这个关于循环线程的问题也假设线程没有被循环
- 使用加入或停止杀死-
stop()
不是我可以访问的选项。join()
可用但它不起作用,即在它被调用后,下一个线程(PRINT #2)继续打印。 - 其他建议使用信号 (1) (2)的答案也不起作用。
- 在我的代码的不同部分使用 sys.exit() 或中断也不会导致线程停止。
有什么方法可以让我轻松退出这样的循环线程吗?
注意:我需要使用线程而不是多处理。
解决方案
您可以使用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()
推荐阅读
- javascript - 如何自动幻灯片放映
- java - JVM 和 C++ 之间的纳秒精度差异
- javascript - 我正在尝试使用 jQuery 操作页面上的特定链接
- c# - 简明的键值对动态列表
- laravel - Spatie 媒体库 - 覆盖后删除原件
- python - 错误地在双“for”循环内建立索引
- java - SQL Spark Java拆分连接的字符串
- mysql - 如何在 Aurora 中启用 lambda_sync/lambda_async 函数
- angular - 如何在angular4中检索ng2-timepicker的值
- python - BeautifulSoup 网页抓取错误