У меня есть программа, в которой я хочу сделать две вещи:
Взаимодействовать с сервером и реагировать на события с сервера. Я делаю это, используя скрученный.
Имейте подсказку командной строки для пользователя, где он может вводить дополнительные команды. Я использую для этого модуль 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 в качестве основного потока и сделать входной поток демоном, поэтому он должен завершиться при выходе из реактора, однако флаг демона ничего не изменил (поток не завершился, когда основной поток сделал) . Кроме того, это, вероятно, опасно, так как поток может делать что-то важное, когда он убит.
Есть ли выход из этого?
stdiodemo.py
, который должен стать хорошей отправной точкой. . В примере показано, как делать то, что вы хотите, без потоков. - person notorious.no   schedule 19.05.2017