Ich habe eine Klasse, die in separaten Threads in meiner Anwendung ausgeführt wird. Ich kann mehrere Threads gleichzeitig ausführen und die Threads sind Daemons. Nach einer gewissen Zeit müssen einige dieser Threads empfangen und eine Nachricht verarbeiten. Wie mache ich das?Wie sende ich Daten an einen laufenden Python-Thread?
Eine Probe von meinem Code sieht wie folgt aus:
import threading
import time
class MyThread(threading.Thread):
def __init__(self, args=(), kwargs=None):
threading.Thread.__init__(self, args=(), kwargs=None)
self.daemon = True
self.receive_messages = args[0]
def run(self):
print threading.currentThread().getName(), self.receive_messages
def do_thing_with_message(self, message):
if self.receive_messages:
print threading.currentThread().getName(), "Received %s".format(message)
if __name__ == '__main__':
threads = []
for t in range(10):
threads.append(MyThread(args=(t % 2 == 0,)))
threads[t].start()
time.sleep(0.1)
for t in threads:
t.do_thing_with_message("Print this!")
Diese Ausgänge:
Thread-1 True
Thread-2 False
Thread-3 True
Thread-4 False
Thread-5 True
Thread-6 False
Thread-7 True
Thread-8 False
Thread-9 True
Thread-10 False
MainThread Received %s
MainThread Received %s
MainThread Received %s
MainThread Received %s
MainThread Received %s
Ich erwarte jedoch, diese letzten fünf Zeilen nicht auf die MainThread
und stattdessen bezogen werden von %s
, würde ich es mir Print this!
, wie so erwarten:
Thread-1 True
Thread-2 False
Thread-3 True
Thread-4 False
Thread-5 True
Thread-6 False
Thread-7 True
Thread-8 False
Thread-9 True
Thread-10 False
Thread-1 Received Print this!
Thread-3 Received Print this!
Thread-5 Received Print this!
Thread-7 Received Print this!
Thread-9 Received Print this!
Wie kann ich eine Nachricht wie diese korrekt an die laufenden Threads senden?
Nachtrag:
Wenn ich diesen Block nach dem Block Print this!
haben, und nutzen @ Dano Code das Problem oben zu lösen, es scheint nicht auf diese neuen Nachrichten zu reagieren.
for t in threads:
t.queue.put("Print this again!")
time.sleep(0.1)
In diesem Fall
, würde ich das Ende meiner Ausgabe erwarten wie diese können suchen
Thread-1 Received Print this!
Thread-3 Received Print this!
Thread-5 Received Print this!
Thread-7 Received Print this!
Thread-9 Received Print this!
Thread-1 Received Print this again!
Thread-3 Received Print this again!
Thread-5 Received Print this again!
Thread-7 Received Print this again!
Thread-9 Received Print this again!
Dies ist, was [Task-Schlangen] (http: // www .celeryproject.org /) sind für. –
@BurhanKhalid Ich würde sagen, dass die Verwendung von etwas wie Sellerie hier zuviel wäre. Sellerie ist definitiv nützlich, um Arbeit an mehrere Prozesse oder mehrere Maschinen in einem Cluster zu verteilen, aber etwas viel Einfacheres wird hier den Anforderungen des OP entsprechen. – dano