OVH Cloud OVH Cloud

print et threads

3 réponses
Avatar
Hexade
Bonjour,
j'aimerais bien pouvoir utiliser la commande "print" dans diff=E9rents
threads, et faire en sorte que le flux soit redirig=E9 s=E9par=E9ment pour
chaque thread.
Malheureusement, j'ignore comment faire et j'ai la forte impression que
ce n'est pas forc=E9ment possible...
Merci d'avance ;-)

3 réponses

Avatar
Andréï
Bonjour,
j'aimerais bien pouvoir utiliser la commande "print" dans différents
threads, et faire en sorte que le flux soit redirigé séparément pour
chaque thread.
Malheureusement, j'ignore comment faire et j'ai la forte impression que
ce n'est pas forcément possible...
Merci d'avance ;-)


Salut,
ne faudrait il pas mieux créer un thread qui affiche les messages avec
une queue et que chaque thread qui voudrait afficher un message envoie
le message à afficher a ce nouveau thread.
A++

Avatar
Pierre Quentel
Bonjour,
j'aimerais bien pouvoir utiliser la commande "print" dans différents
threads, et faire en sorte que le flux soit redirigé séparément pour
chaque thread.
Malheureusement, j'ignore comment faire et j'ai la forte impression que
ce n'est pas forcément possible...
Merci d'avance ;-)

Mais si, avec Python, tout est possible, tout est réalisable !


J'ai trouvé cette solution dans un post de Hrvoje Niksic sur
comp.lang.python. Comme la commande print fait appel à la méthode
write() de sys.stdout, il faut dans chaque thread affecter à sys.stdout
un objet dépendant du thread, et possédant une méthode write

Ces objets sont stockés dans un dictionnaire dont la clé est le thread
courant, récupéré par threading.currentThread(). Quand on appelle la
méthode write, on récupère le "bon" objet et on fait ce qu'on a à faire
avec les données à imprimer

Un exemple avec une fenêtre Tkinter :


from Tkinter import *
import thread
import threading
import sys
import random
import time

stdout_objs = {}

class Stdout:

def __init__(self,w):
stdout_objs[threading.currentThread()] = w

def write(self,data):
stdout_objs[threading.currentThread()].insert(END,data)

def show(arg):
sys.stdout = Stdout(windows[arg])
for k in range(5):
print "print dans le thread %s" %arg
time.sleep(random.randint(1,4))

root = Tk()
windows = []
for i in range(2):
t = Text(root)
t.pack()
windows.append(t)

for i in range(2):
thread.start_new_thread(show,(i,))

root.mainloop()

A+
Pierre

Avatar
Hexade
Merci beaucoup, Pierre !
Je vais aller tester ça...