2017-08-24 2 views
0

Je tente de rediriger stdin, stdout et stderr d'un programme débogué dans python, et j'ai vite vu que d'autres personnes ont eu du succès en affectant StringIO instances à sys.stdin/out/err. Toutefois, le programme débogué est dans un thread, tandis que les instances StringIO sont écrites et lues à partir d'un thread différent. Aucune documentation que je peux trouver ne décrit les objets StringIO comme étant thread safe, et bien que je puisse envelopper mes propres appels en lecture/écriture dans les verrous, je ne pense pas que je puisse forcer les programmes débogués à utiliser ces mêmes verrous.Python3: Mécanismes Threadsafe pour rediriger stdin, stdout, stderr

Comment forcer StringIO à faire ce que je veux? Sinon, que ferai-je ce que je veux?

Edit: Comme demandé un exemple d'une condition de course prévue est la suivante:

disons que je lis de stdout. J'ai lu le contenu complet de StringIO, puis vider l'objet ... sauf qu'entre mes opérations de lecture et de vidage, le programme débogué a imprimé plus d'informations, qui finissent par être vidées. En d'autres termes, je perds une partie de l'information.

Edit 2: J'ai trouvé une autre question demandant essentiellement the same question, mais sa réponse ne semble pas très pythonique, donc je laisse cette

ouverte
+0

désolé si ce n'est pas clair pour moi seulement, mais quel genre de comportement de thread-dangereux vous inquiétez-vous? Y a-t-il une course spécifique que vous essayez d'empêcher? – turbulencetoo

+0

J'ai mis dans une édition rapide pour illustrer ce que je veux dire –

+0

utiliser une file d'attente, mettre le message à écrire à partir de thread1, tandis que boucle dans thread2 avec 'try: queue.get (timeout = 0.1) sauf queue.Empty: pass '. – T4rk1n

Répondre

0

je suis tombé sur la réponse tout en feuilletant Qdb « s code source. Cette mise en œuvre réaffecte stdin, stdout et stderr-self, et met en œuvre les fonctions de fichiers comme suit:

close 
encoding 
isatty 
flush 
writelines 
write 
readlines 
readline 

Maintenant, parce que toutes les fonctions io sont au sein de votre classe (en supposant que vous » En utilisant une classe), vous pouvez contrôler la synchronisation toute la journée.