所以我有主线程产生工作线程,它有无限循环来处理系统监视。所以它看起来像这样
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上干净利落地退出。所以我想确保文件已关闭并且线程退出。有没有什么好方法可以解决这个问题?
提前感谢您的帮助!
答案 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
正常生存的线程触发,并清理现在没有工作的主线程。