Twisted和命令行界面

时间:2017-05-19 19:02:09

标签: python twisted python-multithreading python-cmd

我有一个程序,我想做两件事:

  1. 与服务器交互并响应来自服务器的事件。我正在使用twisted。

  2. 为用户提供命令行提示,以便发出其他命令。到目前为止,我正在使用python cmd模块。

  3. 似乎没有其他选择,只有两个线程,因为readline只有一个阻塞接口,需要处理像自动完成这样的东西。另一方面扭曲必须连续运行反应堆。

    现在的问题是,为此处理Ctrl-C似乎很难。简单的解决方案似乎是在主线程中运行命令行,并且只需使用reactor.callFromThread与程序的其余部分进行每次交互。这很容易,因为覆盖Cmd.onecmd可以通用方式执行此操作。但是,当我尝试在

    的线程中生成反应器时
    t = Thread(target=reactor.run)
    t.start()
    

    我立即得到例外

    File "/usr/lib/python3.6/signal.py", line 47, in signal
        handler = _signal.signal(_enum_to_int(signalnum), _enum_to_int(handler))
    builtins.ValueError: signal only works in main thread
    

    每个使用扭曲的人都坚持认为扭曲的反应器应该在主线程中运行,因为那样的设计会更好。

    当尝试以这种方式执行并在主线程中运行时,它将捕获Ctrl-C,退出反应堆并且我遇到一个不退出的线程,因为在cmdloop中调用input()不回来。我试图寻找一个解决方案,以及如何退出input()调用,但每个人都坚持命令行界面应该在主线程中运行。

    我发现一个可能的选项是将twisted作为主线程运行并使输入线程成为守护进程,因此它应该在反应器退出时退出,但是守护进程标志没有改变任何东西(主线程没有在主线程时退出)线程确实)。此外,这可能很危险,因为线程在被杀死时可能会做一些重要事情。

    有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

看一看invective如何使用Twisted和没有线程(一种方法来读取代码可能是start at the mainpoint并继续工作)。