Twisted и интерфейс командной строки

У меня есть программа, в которой я хочу сделать две вещи:

  1. Взаимодействовать с сервером и реагировать на события с сервера. Я делаю это, используя скрученный.

  2. Имейте подсказку командной строки для пользователя, где он может вводить дополнительные команды. Я использую для этого модуль python cmd.

Кажется, нет другого выбора, кроме двух потоков, поскольку 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, выйдет из реактора, и я застрял с потоком, который не выходит, так как вызов input() внутри cmdloop не возвращается . Я пытался найти решение этой проблемы и то, как выйти из вызова input(), но все также настаивают на том, чтобы интерфейс командной строки работал в основном потоке.

Один потенциальный вариант, который я нашел, состоял в том, чтобы запустить Twisted в качестве основного потока и сделать входной поток демоном, поэтому он должен завершиться при выходе из реактора, однако флаг демона ничего не изменил (поток не завершился, когда основной поток сделал) . Кроме того, это, вероятно, опасно, так как поток может делать что-то важное, когда он убит.

Есть ли выход из этого?


person Leonidaz0r    schedule 19.05.2017    source источник
comment
На странице примеры Twisted есть пример под названием stdiodemo.py, который должен стать хорошей отправной точкой. . В примере показано, как делать то, что вы хотите, без потоков.   -  person notorious.no    schedule 19.05.2017


Ответы (1)


Посмотрите, как invective делает это с Twisted и без потоков (одним из способов чтения кода может быть чтобы начать с главного и двигаться дальше ).

person Jean-Paul Calderone    schedule 20.05.2017