2017-02-14 1 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) 

main()은 리눅스 서버에서 실행되며, python 콘솔에서 실행됩니다. 문제는 내가 main()을 실행할 때 콘솔이 절대로 "이름을 입력 하시겠습니까?"라고 약속하지 않는다는 것입니다. 나는 들어가기 위하여 정다 - 30 초를 기다린다 - 아무것도. 두 번 입력하십시오. 30 초 동안 아무것도 기다리지 마십시오. 5 번 (실수로 여섯 번째)과 같이 입력 할 때만 "이름을 입력 하시겠습니까?"라는 메시지가 표시됩니다. 무슨 일이 벌어지고 있으며 어떻게 피할 수 있습니까? 즉, "이름을 입력 하시겠습니까?"라는 즉석 출력을 얻으시겠습니까?

추가 정보 : Windows 컴퓨터에서 시작할 때이 문제가 표시되지 않습니다. 문제는 Linux 컴퓨터에서만 발생합니다.

답변

0

다른 스레드에서 stdin/stdout으로 입출력을하고있는 것이 문제 일 수 있습니다. 스레드와 stdin/stdout은 잘 작동하지 않습니다. 모두 input에서 대기하는 4 개의 스레드를 상상해보십시오. Enter 키를 누릅니다 ... 어떤 스레드가 키 입력을 볼 수 있습니까? 그것은 기본적으로 무작위입니다. 출력과 동일합니다. stdout에 쓰는 다중 스레드는 매우 이상한 결과를 초래할 수 있습니다.

큰 지연은 설명하지 않습니다. 모든 코드를 표시하지 않았습니다. main()은 무엇을할까요? 데몬을 시작하는 Pyro 호출을 일부 print 문으로 대체하면 문제가 해결됩니까? 기본적으로 : 문제의 원인 (코드 줄)을 정확하게 파악하고 거기에서 계속하십시오.

관련 문제