2017-02-14 3 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コンソールから起動されたLinuxサーバーで動作します。問題は、私がmain()を起動したときに、コンソールが私に「名前を入力したいですか?私はちょっと待ってください - 30秒待ってください - 何もありません。 2回入力する - 30秒間何も待たない。私が5回(そして間違って6回目)のような入力をクリックするときだけ、「あなたは名前を入力しますか?」と表示されます。 何が起こっているのか、これを避けるにはどうすればいいですか。「名前を入力しますか?」というインスタントプリントアウトを取得しますか?

追加情報: Windowsマシンで起動するとこの問題は発生しません。この問題はLinuxマシンでのみ発生します。

答えて

0

問題は、異なるスレッドからstdin/stdoutへの入力と出力を行っている可能性があります。スレッドとstdin/stdoutは一緒にうまく動作しません。すべてのスレッドが待っているのを想像してください。input ...あなたはEnterを押します...あなたのキーストロークはどのスレッドに表示されますか?それは基本的にランダムです。出力と同じです。 stdoutへの複数のスレッドの書き込みは非常に奇妙な結果を生むことがあります。

大きな遅延は説明しませんが、すべてのコードを表示していません。 main()は何をしますか?デーモンを起動するPyro呼び出しをいくつかのprint文で置き換えると、問題は解決しますか?基本的に:問題の原因がどこのコードであるかを正確に把握し、そこから続行してください。

関連する問題