C'est fou! J'ai entendu que les threads Python sont lents mais c'est au-delà de la normale.La même vitesse de socket est 66% plus lente sur un nouveau thread?
Voici le pseudo-code:
class ReadThread:
v = []
def __init__(self, threaded = True):
self.v = MySocket('127.0.0.1')
if threaded:
thread.start_new_thread(self._scan,())
def read(self):
t0 = datetime.now()
self.v.read('SomeVariable')
t = datetime.now()
dt = (t-t0).total_seconds()
print dt
def _scan(self):
while True:
self.read()
Si je lance la lecture() dans une boucle while dans le thread principal comme ceci:
r = ReadThread(threaded = False)
while True:
r.read()
dt est d'environ 78 ms avec petite variation. Maintenant, si je le lance dans un nouveau fil comme celui-ci:
r = ReadThread(threaded = True)
while True:
pass
dt est d'environ 130 ms avec + -10ms variance!
Pourquoi est-ce si lent? Est-ce que je fais quelque chose de vraiment mal? C'est la même chose juste dans un nouveau fil! MySocket() est un objet qui utilise un socket pour lire/écrire des variables sur un serveur et read() reçoit juste une variable pour le test.
Vous avez raison. Je suis stupide. Même vitesse maintenant ... – Carlos
Dans le code réel, chaque thread demande des valeurs en les écrivant dans une liste. Un autre thread lit la liste et écrit les réponses. Il surveille de manière continue les nouvelles demandes. Les threads de consommation surveillent constamment les réponses. J'ai trouvé qu'un petit time.sleep() fait l'affaire mais quelles seraient les autres façons de mieux résoudre le problème? Des événements peut-être? – Carlos
Vous devez apprendre les primitives de synchronisation de threads (https://docs.python.org/3.4/library/threading.html). Je pense que 'Event' et/ou' Condition' sont les plus adaptés à votre cas d'utilisation, en fonction du nombre de threads qui doivent réagir. –