用户添加服务器的Tk的Python GUI,它显示有关服务器的端口和资源信息。每个服务器行都在自己的线程中运行,并使用myQueue.put(executor.submit(lambda: <function here>))
循环。我可以加载15个服务器,然后关闭窗口。有时python.exe关闭,IDE显示应用程序结束,退出代码为0.有时我关闭窗口,IDE和任务管理器显示程序仍在运行。一段时间后,pycharm控制台打印&#34;主线程不在主循环中#34;之后别无其他事情发生。我认为使用带有线程的队列会阻止这种情况发生,但是出现了问题。
以下代码的工作流程:用户在弹出窗口中添加服务器信息&gt;通过创建功能运行&gt;信息被传递给threadmaker函数,该函数监视指示器并重新运行SSH会话以在上一个查询完成时查询信息。
main = Tk()
myQueue = queue.Queue()
executor = concurrent.futures.ThreadPoolExecutor(max_workers=16)
def creation(server, nickname, user, passw):
#Create label for server, nickname, user, password here and place them on the main window
myQueue.put(executor.submit(lambda: threadmaker(server, nickname, user, passw)))
def threadmaker(server, nickname, user, passw):
# this function loops until indicator is 0 and then runs refresh function
global workinglist
if 'normal' == main.state():
if workinglist[server + "counter"] == "1":
time.sleep(3)
myQueue.put(executor.submit(threadmaker(server, nickname, user, passw)))
if workinglist[server + "counter"] == "0":
myQueue.put(executor.submit(refresh(server, nickname, user, passw)))
time.sleep(3)
myQueue.put(executor.submit(threadmaker(server, nickname, user, passw)))
if 'normal' != main.state():
print(main.state())
pass
def refresh(server, nickname, user, passw):
global workinglist
workinglist[server + "counter"] = "1"
if 'normal' == main.state():
if 'normal' == main.state():
try:
ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(str(server), username=str(user), password=str(passw), timeout=10, allow_agent=False, look_for_keys=False)
stdin, stdout, stderr = ssh.exec_command("DF -H")
type(stdin)
test2 = stdout.readlines()
stdin.flush()
stdin.close()
ssh.close()
#<< do soething with the test2 value>>
except Exception as E:
print(E)
if 'normal' == main.state():
try:
#<< another ssh query >>
except Exception as E:
pass
workinglist[server + "counter"] = "0"
main.mainloop()
我是否错误地处理了线程或队列?
我已将print(threading.currentThread().getName(), 'Starting')
添加到刷新功能的开头,并且正在运行的线程编号永远不会超过为主线程添加的服务器数量+ 1。所以如果我用我的线程池处理所有线程什么挂起?我假设ssh尝试的东西。