如果TK窗口关闭太快,程序会继续运行

时间:2016-11-11 18:11:27

标签: multithreading python-3.x tkinter queue

用户添加服务器的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尝试的东西。

0 个答案:

没有答案