2016-07-07 6 views
0

Es gibt zwei Dateien bezogen werden: backend_service.py und web_handler.pyThema kann nicht das Produkt in der Warteschlange erhält

in backend_service.py

job_queue = Queue.Queue(5) 

def submit_job(job): 

    job_queue.put(job) 
    logger.info("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() 
      logger.info("---------got job:%d" %job.order_id) 

      print "======================I am a task================" 
      job_queue.task_done() 

     else: 
      logger.info("the queue is empty. will sleep 20 seconds:%d..." %job_queue.qsize()) 

      time.sleep(20) 

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

in web_handler.py (Web-App auf Basis von Web. py der hTTP-Anforderung zu behandeln. Der Web-Server ist uwsgi)

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

wird aufgerufen und job_queue.qsize kann richtigen Wert in submit_job f zurückkehren Salbung. Der Thread sagt jedoch immer, dass die Warteschlange leer ist.

Es sieht so aus, als ob der Thread unter dem Web-Service-Status nicht den richtigen Status der Warteschlange abrufen kann. Während ich die Logik mit Unit-Test getestet habe. Es kann korrekt funktionieren. Könnten Sie bitte überprüfen, wo ich falsch liege?

+0

Wo wird das Objekt 'job_queue' in den Namespace web_handler übergeben? – dodell

+0

Es gibt ein gutes Beispiel hier, muss Warteschlangenobjekt übergeben, wenn Thread aufgerufen wird. https://pymotw.com/2/Queue/ – dodell

+0

@dodell, web_handler.py hängt nur von der Funktion submit_job ab. und auf die Warteschlange wird in der Funktion submit_job selbst zugegriffen. – WenJ

Antwort

0

Ich denke, dein Problem besteht darin, dass dein Skript beendet wird, bevor der Thread die Möglichkeit hat, irgendwelche Elemente aus der Warteschlange zu sammeln.

In backend_service.py wird Ihr Thread gestartet, bevor etwas zur Warteschlange hinzugefügt wird, so erhalten Sie "Die Warteschlange ist leer ...", das erste Mal.

In web-handler.py, denke ich, was geschieht (obwohl ich nicht ohne mehr Code sicher sein können), Sie backend_service importieren, die den Faden und die Warteschlange beginnt, rufen Sie submit_job() und dann das Skript endet, endet auch den Faden vor es bekommt eine Chance, die Warteschlange erneut zu betrachten.

Wenn Sie nach dem Aufruf von job_submit eine Verzögerung hinzufügen, sehen Sie, dass die Elemente erfolgreich von handle_photos() aus der Warteschlange übernommen werden. Ich habe den Code in einen MCVE, einschließlich einer Verzögerung nach der Auftragsübermittlung bearbeiten (und nur für 2s zwischen den Schleifen schlafen), und alles ist in Ordnung:

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) 

Ausgabe::

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

Danke für Ihre ausführliche Hilfe SiHa. Was web_handler.py angeht, habe ich es einfach vereinfacht. Es ist ein Web-Request-Handler basierend auf web.py. Wenn es eine HttpRequest empfängt, löst es die Funktion submit_job aus. Zu diesem Zeitpunkt wissen Sie, dass der Thread läuft und der Thread sollte nur enden, wenn die gesamte Web-App heruntergefahren ist. Was Ihr Testergebnis betrifft, bekomme ich auch das gleiche Ergebnis. Mein Problem ist, dass der laufende Thread immer sagt, dass die Warteschlange leer ist, während die Funktion submit_job den richtigen Status der Warteschlange erhalten kann. – WenJ

+0

Entschuldigung, das Problem tritt unter der Web uswgi-Umgebung auf.In dem Unit-Test-Skript wie dem Ihren funktionierten sie gut. Ich bin so verwirrt. – WenJ

+0

Oh. Hoffe, du findest deine Antwort. – SiHa

0

Es ist aufgrund des Fadens neuen Verbraucher in der gleichen Prozedur nicht mit dem Produzenten eins.

Ich bin mir nicht sicher, die Ursache, vielleicht wegen uwsgi?

Verwandte Themen