2016-08-03 11 views
1

Python RQ(v0.5.6およびv0.6.0でテスト済み)を使用してマルチスレッドタスクを実行する際に問題が発生しています。RQタイムアウトでマルチスレッドジョブが終了しない

は私が達成しようとしているものの簡易版として、次のコードを考えてみましょう:

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) 

実行する場合main.py(rqworkerはバックグラウンドで実行されていますが)、ジョブは5秒以内にタイムアウトによって期待どおりに中断されます。

MyThing().hello_taskのようなスレッド/ sを含むタスクを設定しているときに、スレッドが永久に実行され、5秒のタイムアウトが終了しても何も起こらないという問題があります。

タイムアウトがタスク、その息子、孫、妻を殺すように、RQでマルチスレッドタスクを実行するにはどうすればよいですか?

+1

はRQの問題として投稿する良い質問のように聞こえる:https://でgithubのあなたが望むなら、あなたはまた、タイムアウト例外をキャッチし、それを扱うことができる

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

その方法:そうのように.com/nvie/rq/issues – ErikR

+0

私が何かを逃していないことを確認したい(?) – Kludge

答えて

1

t.join()を実行すると、hello_taskスレッドがブロックされ、say_helloスレッドが戻るまで待機します。したがって、rqからのタイムアウト信号は受信されません。メインスレッドの実行を許可し、スレッドの実行が完了するのを待つ間に、一定の時間待機してThread.joinを使用して、タイムアウト信号を適切に受信できるようにすることができます。

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 
関連する問題