2016-07-07 9 views
0

でアイテムを取得することはできません関連の2つのファイルがあります。 httpリクエストを処理するためのPY。ウェブサーバがuwsgiある)スレッドがキュー

def GET(): 
    job = Job() 
    backend_service.submit_job(job) 

が呼び出され、job_queue.qsizesubmit_job Fに正しい値を返すことができます統一。ただし、スレッドは常にキューが空であることを示します。

スレッドがWebサービスのステータスでQueueの正しいステータスを取得できないようです。私はユニットテストを使用してロジックをテストしている間。それは正しく動作します。 私が間違っている場所を確認するのを手伝ってもらえますか?

+0

web_handler名前空間に渡される 'job_queue'オブジェクトはどこにありますか? – dodell

+0

ここで良い例があります、スレッドを呼び出すときにキューオブジェクトを渡す必要があります。 https://pymotw.com/2/Queue/ – dodell

+0

@dodell、web_handler.pyはsubmit_job関数のみに依存します。キューは関数submit_job自体でアクセスされます。 – WenJ

答えて

0

あなたの問題は、スレッドがキューからアイテムを収集する機会を得る前に、スクリプトが終了したことだと思います。

backend_service.pyでは、スレッドが何かがキューに追加される前に開始されるので、「キューは空です...」、最初のラウンド。 web-handler.py

(私はより多くのコードなしで確認することはできませんが)、私は何が起こっているかと思いますが、あなたはbackend_serviceをインポートスレッドとキューを開始し、あなたも前にスレッドを終了すると、スクリプトが終了し、その後submit_job()を呼び出し、再び待ち行列を見る機会を得る。

job_submitコールの後に遅延を追加すると、アイテムがhandle_photos()によってキューから正常に取得されたことがわかります。私は、ジョブ投入後の遅延を含む(とのみループ間の2秒のために眠っている)、MCVEにコードを編集してきたが、すべてがOKです:

backend_service.py:

import Queue 
import threading 
import time 

job_queue = Queue.Queue(5) 

def submit_job(job): 

    job_queue.put(job) 
    print("Enqueue new Job: JobID:%d,queue size:%d" %(job.order_id,job_queue.qsize())) 

def handle_photos(): 
    while True: 
     if not job_queue.empty(): 

      job = job_queue.get_nowait() 
      print("---------got job:%d" %job.order_id) 

      print "======================I am a task================" 
      job_queue.task_done() 
     else: 
      print("the queue is empty. will sleep 20 seconds:%d..." %job_queue.qsize()) 

      time.sleep(2) 

worker_thread = threading.Thread(target=handle_photos) 
worker_thread.setDaemon(True) 
worker_thread.start() 

web_handler.pyを:

import backend_service 
import time 

class a(): 
    def __init__(self,order_id): 
     self.order_id = order_id 

for i in range(3): 
    job = a(i) 
    backend_service.submit_job(job) 

time.sleep(20) 

出力:

C:\TestScripts>python web_handler.py 
the queue is empty. will sleep 20 seconds:0...Enqueue new Job: JobID:2,queue size:1 

Enqueue new Job: JobID:2,queue size:2 
Enqueue new Job: JobID:2,queue size:3 
---------got job:2 
======================I am a task================ 
---------got job:2 
======================I am a task================ 
---------got job:2 
======================I am a task================ 
the queue is empty. will sleep 20 seconds:0... 
the queue is empty. will sleep 20 seconds:0... 
the queue is empty. will sleep 20 seconds:0... 
the queue is empty. will sleep 20 seconds:0... 
the queue is empty. will sleep 20 seconds:0... 
the queue is empty. will sleep 20 seconds:0... 
the queue is empty. will sleep 20 seconds:0... 
the queue is empty. will sleep 20 seconds:0... 
the queue is empty. will sleep 20 seconds:0... 
+0

あなたの詳細なヘルプSiHaをありがとう。 web_handler.pyに関しては、私は単純化しました。 webリクエストハンドラベースのweb.pyです。 HttpRequestを受け取ると、submit_job関数がトリガーされます。現時点では、スレッドが実行されていることを知っており、スレッドはWebアプリケーション全体がシャットダウンされて終了する必要があります。あなたのテスト結果についても、同じ結果が得られます。ですから、私の問題は、実行中のスレッドが常にキューが空であると言いますが、submit_job関数はキューの正しいステータスを取得できます。 – WenJ

+0

申し訳ありませんが、この問題はウェブのuswgi環境で発生します。あなたのような単体テストスクリプトでは、うまくいきました。私はとても混乱しています。 – WenJ

+0

ああ。あなたがあなたの答えを見つけることを願っています。 – SiHa

0

それは、新しい消費者のスレッドによるものですが、同じPROCではありませんプロデューサーと一緒にエッセイ。

根本的な原因がわからないのは、おそらくuwsgiですか?

関連する問題