2016-08-03 5 views
1

Ich habe Probleme beim Ausführen Multithread-Aufgaben mit Python RQ (getestet auf v0.5.6 und v0.6.0).RQ Timeout nicht Multi-Thread-Aufträge

Betrachten Sie das folgende Stück Code, als eine vereinfachte Version von dem, was ich versuche zu erreichen:

thing.py

from threading import Thread 

class MyThing(object): 
    def say_hello(self): 
     while True: 
      print "Hello World" 

    def hello_task(self): 
     t = Thread(target=self.say_hello) 
     t.daemon = True # seems like it makes no difference 
     t.start() 
     t.join() 

main.py

from rq import Queue 
from redis import Redis 
from thing import MyThing 

conn = Redis() 

q = Queue(connection=conn) 

q.enqueue(MyThing().say_hello, timeout=5) 

Bei der Ausführung main.py (während rqworker im Hintergrund ausgeführt wird), bricht der Job wie erwartet nach Timeout innerhalb von 5 Sekunden ab.

Problem ist, wenn ich eine Aufgabe mit Thread/s wie MyThing().hello_task festlegen, läuft der Thread für immer und nichts passiert, wenn das Timeout von 5 Sekunden vorbei ist.

Wie kann ich eine Multithread-Aufgabe mit RQ ausführen, so dass die Zeitüberschreitung die Aufgabe, ihre Söhne, Enkel und ihre Frauen tötet?

+1

Klingt wie eine gute Frage als rq Frage zu stellen: https: // Github .com/nvie/rq/issues – ErikR

+0

Wollte sichergehen, dass ich nichts vermisse (?) – Kludge

Antwort

1

Wenn Sie t.join() ausführen, blockiert der hello_task Thread und wartet, bis der say_hello Thread zurückgibt - also nicht das Timeout-Signal von rq erhalten. Sie können zulassen, dass der Hauptthread ordnungsgemäß ausgeführt wird, und das Zeitüberschreitungssignal ordnungsgemäß empfangen, indem Sie Thread.join mit einer bestimmten Wartezeit verwenden, während Sie darauf warten, dass der Thread beendet wird. Wie so:

def hello_task(self): 
    t = Thread(target=self.say_hello) 
    t.start() 
    while t.isAlive(): 
     t.join(1) # Block for 1 second 

Auf diese Weise können auch die Timeout-Ausnahme abfangen konnte und damit umgehen, wenn Sie es wünschen:

def hello_task(self): 
    t = Thread(target=self.say_hello) 
    t.start() 
    try: 
     while t.isAlive(): 
      t.join(1) # Block for 1 second 
    except JobTimeoutException: # From rq.timeouts.JobTimeoutException 
     print "Thread killed due to timeout" 
     raise