あなたの問題は、スレッドがキューからアイテムを収集する機会を得る前に、スクリプトが終了したことだと思います。
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...
web_handler名前空間に渡される 'job_queue'オブジェクトはどこにありますか? – dodell
ここで良い例があります、スレッドを呼び出すときにキューオブジェクトを渡す必要があります。 https://pymotw.com/2/Queue/ – dodell
@dodell、web_handler.pyはsubmit_job関数のみに依存します。キューは関数submit_job自体でアクセスされます。 – WenJ