Python多线程退出工作线程

时间:2018-02-06 03:27:39

标签: python multithreading python-multithreading

所以我有主线程产生工作线程,它有无限循环来处理系统监视。所以它看起来像这样

while True:
     Check_server_status( host )
     wait( *minutes* )

这个工作线程应该永远运行,因为我们需要不断监视服务器,并且每个线程当前正在监视一台机器,但我可以对其进行扩展,以便每个线程都有一个要检查的服务器列表。此外,每个线程都在向csv文件写入它正在查找的信息。

主线程只为它在列表中找到的每个主机调用此线程。

hosts = [a,b]
threads = []
for host in hosts:
     t = worker( host )
     t.daemon = True
     t.start()
     threads.append( t )

我试图让这个脚本在ctrl-c上干净利落地退出。所以我想确保文件已关闭并且线程退出。有没有什么好方法可以解决这个问题?

提前感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

好吧,对于初学者来说,主线程结束后终止的Error: (23, 31) error: reference to findViewById is ambiguous both method findViewById (int) in Activity and method <T> findViewById (int) in AppCompatActivity match where T is a type-variable: T extends View declared in method <T> findViewById (int) 线程没有正确清理,所以请不要这样做。

并且daemon不一定要传递给主线程或任何特定线程,所以在这里依赖Python KeyboardInterrupt的默认处理程序可能不是最好的,而是编写自己的处理程序替换它。

可能最简单的方法是让所有线程在共享SIGINT对象上循环,基于threading.Event调用进行循环(这样你的每个循环睡眠就会折叠到.wait(*seconds*)条件,你可以在等待的任何时候立即退出。

所以你可以这样做:

while

然后你的工人职能将是以下形式:

import threading

shouldexit = threading.Event()

他们都会在没有将它们设置为def worker(host): while not shouldexit.wait(minutes * 60): Check_server_status( host ) 的情况下启动,并且您将注册一个daemon处理程序,如下所示:

SIGINT

理想情况下,在这种情况下,没有生命主线程可以终止(所有线程都将在共享import signal def ctrlchandler(signum, frame): print('User triggered quit') shouldexit.set() # Set the signal handlers for the Ctrl-C related events if hasattr(signal, 'CTRL_C_EVENT'): # Only on Windows signal.signal(signal.CTRL_C_EVENT, ctrlchandler) signal.signal(signal.SIGINT, ctrlchandler) 上循环,主线程在启动工作线后退出);如果不是这样的话,你需要弄清楚终止主线程的方法。

一种方法可能是在注册替换处理程序时存储Event的默认处理程序,在设置SIGINT后让处理程序join所有工作线程,然后显式调用原始的Event处理程序使SIGINT正常生存的线程触发,并清理现在没有工作的主线程。