2017-02-14 8 views
0

Есть функция вида:пользовательского ввода пользователем строки (объекта конструктор) не появляется/появляется эпизодически, когда вызывается из отдельного потока

def setup_my_object(): 
    my_object = My_Object() 
    my_object_daemon = Pyro4.core.Daemon(port=55666) 
    Pyro4.Daemon.serveSimple({my_object: "my.object"},ns = False,daemon = my_object_daemon) 

Pyro4 библиотека позволяет получить доступ к объекту по сети. Поскольку основной процесс создает несколько различных объектов, отдельный поток создается с помощью:

def main(): 
    threaded_object = threading.Thread(target = setup_my_object) 
    threaded_object.start() 

объекта имеет вид (в действительности конструктор является более сложным).

class My_Object(object): 
    def __init__(self): 
     name_option = input('\nDo you want to enter a name? [y/n]:\n') 
     if (name_option == 'y') 
      self.m_name = add_name() 

    def add_name(self): 
     name = input('\nPlease enter the name: \n') 
     return(name) 

Главный() работает на сервере linux, запущенном с консоли python. Проблема в том, что когда я запускаю main(), консоль никогда не пропускает меня. «Вы хотите ввести имя?». Я вздрагиваю, входя - подождите 30 секунд - ничего. Хит введите два раза - подождите 30 секунд. Только когда я нажимаю кнопку, как пять раз (и непреднамеренно шестой), он отобразит «Вы хотите ввести имя?». Что происходит и как я могу избежать этого, т. Е. Получить мгновенную распечатку «Вы хотите ввести имя?»?

Дополнительная информация: Я не вижу этой проблемы при запуске на компьютере под управлением Windows; проблема заключается только в машине Linux.

ответ

0

Проблема может заключаться в том, что вы выполняете ввод и вывод в stdin/stdout из разных потоков. Нити и stdin/stdout не работают хорошо вместе. Представьте себе 4 потока, которые все сидят в своем input ... и вы нажимаете enter ... какой поток будет видеть ваше нажатие клавиши? Это в основном случайное. То же самое с их выходом; несколько потоков, записывающих в stdout, могут создавать очень странные результаты.

Это не объясняет большую задержку, хотя. Вы не указали весь свой код. Что делает main() делать больше? Если вы замените вызовы Pyro, которые запускают демон некоторыми операторами печати, проблема исчезнет? В основном: выяснить, где именно причина вашей проблемы (какая строка кода) и продолжить оттуда