2017-02-14 3 views
0

ont une fonction de la forme:rapide d'entrée utilisateur personnalisée (à constructeur objet) ne semble pas/apparaît de façon sporadique lorsqu'il est appelé à partir d'un thread séparé

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) 

bibliothèque Pyro4 permet d'accéder à l'objet sur le réseau. Parce que le processus principal crée plusieurs objets différents, un thread séparé est créé à l'aide:

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

L'objet est de la forme (constructeur en réalité est plus complexe). Le principal() s'exécute sur un serveur linux, lancé à partir d'une console python.

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) 

Le problème est quand je lance Main() la console ne me promet jamais "Voulez-vous entrer un nom?". Je peux frapper - attendre 30 secondes - rien. Appuyez sur entrer deux fois - attendez 30 secondes rien. Seulement quand je clique sur entrer comme cinq fois (et par inadvertance le sixième) il affichera "Voulez-vous entrer un nom?". Que se passe-t-il et comment puis-je éviter cela, c'est-à-dire obtenir une impression instantanée de "Voulez-vous entrer un nom?"?

Informations supplémentaires: Je ne vois pas ce problème lors du lancement sur une machine Windows; le problème est seulement sur une machine Linux.

Répondre

0

Le problème est peut-être que vous effectuez des entrées et des sorties sur stdin/stdout à partir de différents threads. Threads et stdin/stdout ne fonctionnent pas bien ensemble. Imaginez 4 threads qui attendent tous dans leur input ... et vous appuyez sur Entrée ... quel thread verra votre frappe? C'est essentiellement aléatoire. Pareil avec leur sortie; plusieurs threads écrivant sur stdout peuvent produire des résultats très étranges.

Cependant, cela n'explique pas le grand retard. Vous n'avez pas montré tout votre code. Que fait main() faire plus? Si vous remplacez les appels Pyro qui démarrent le démon par des instructions d'impression, le problème disparaît-il? Fondamentalement: comprendre exactement où la cause de votre problème est (quelle ligne de code) et continuer à partir de là