Python3非阻塞输入或查杀线程

时间:2017-07-23 03:42:20

标签: python multithreading python-3.x

通过阅读类似问题的帖子,我强烈怀疑没有办法做我想做的事,但我想问。我有一个程序使用python3设计为无头运行,从已登录的远程用户接收命令。其中一个命令当然是关闭,以便程序可以干净地结束。本节工作正常。

然而,在进行此操作时,我意识到能够直接输入命令而没有远程连接的选项在发生阻止远程访问的异常情况时非常有用。我添加了一个local_control函数,该函数在它自己的线程中运行,因此它不会干扰主循环。除了shutdown命令之外,这适用于所有命令。

我有一个变量,两个循环都监视,以便它们可以在发送shutdown命令时结束。从local_control中发送shutdown命令工作正常,因为循环在返回input()之前结束。然而,当远程发送关闭命令时,程序不会结束,直到有人在本地按下回车键,因为该循环仍然停留在输入()。一旦按下enter键,程序就会继续,成功中断循环并继续正常关闭。下面是我的代码示例。

import threading

self.runserver = True

def local_control(): #system to control server without remote access
    while self.runserver:
        raw_input = input()
        if raw_input == "shutdown":
            self.runserver = False


mythread = threading.Thread(target=local_control) 
mythread.start()


while self.runserver:
    some_input = get_remote_input() #getting command from remote user
    if some_input == "shutdown":
        self.runserver = False

sys.exit(0) #server is shutdown cleanly

因为该程序主要运行无头GUI选项,例如pygame不是一个选项。我在网上找到的其他解决方案涉及非跨平台的库,如msvcrt,termios和curses。虽然它并不是一个干净的选项,但如果我可以做到这一点,那么我只会因为杀死线程而结束它,但是也没办法。那么是否有一个跨平台的非GUI选项来进行非阻塞输入?或者是否有另一种方法可以阻止来自另一个线程的阻塞循环?

2 个答案:

答案 0 :(得分:1)

您的network-IO线程在等待远程命令时阻止了命令的处理,因此它只会在runserver返回后评估get_remote_input()的状态(并处理它的命令) )。

您将需要三个主题:

  • 一个循环在local_control()中,向处理线程发送命令。
  • 一个循环get_remote_input(),同时向处理线程发送命令。
  • 处理线程(可能是主线程)。

此处queue可能会有所帮助,因为您需要避免由runserver目前存在的非同步访问引起的竞争条件。

答案 1 :(得分:1)

不是便携式解决方案,但在* nix中,您可以从local_control函数向自己发送中断信号以打破阻塞input()。对于网络控制线程,您需要pthread ID(pthread_self并将其保存在local_control可读的地方),以便您可以调用pthread_kill