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
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
J'ai mis dans une édition rapide pour illustrer ce que je veux dire –
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