Flasche: Hintergrund-Thread sieht eine nicht leere Warteschlange als leer an

Wenn ich eine Flask-App in uwsgi ausführe, werden im Hintergrund-Thread und in den App-Funktionen unterschiedliche Werte angezeigt, wenn die Größe derselben Warteschlange abgefragt wird.

KomponentenEine Kolbenapplikation mit aThread-sichere Warteschlange.A GET call gibt die Warteschlangengröße zurück.A POST call fügt der Queue ein Element hinzu.Ein Hintergrundthread druckt die Größe der WarteschlangeDas Problem

Wenn die App von der Shell verwendet wirdpython tester.pyIch erhalte das erwartete Ergebnis:

2014-06-07 14:20:50.677995 Queue size is: 0
127.0.0.1 - - [07/Jun/2014 14:20:51] "POST /addMessage/X HTTP/1.1" 200 -
2014-06-07 14:20:51.679277 Queue size is: 1
2014-06-07 14:20:52.680425 Queue size is: 1
2014-06-07 14:20:53.681566 Queue size is: 1
2014-06-07 14:20:54.682708 Queue size is: 1
127.0.0.1 - - [07/Jun/2014 14:20:55] "POST /addMessage/Y HTTP/1.1" 200 -
2014-06-07 14:20:55.687755 Queue size is: 2
2014-06-07 14:20:56.688867 Queue size is: 2

Allerdings, wenn die App mit ausgeführt wirduwsgiIn den Logs bekomme ich folgendes:

2014-06-07 14:17:42.056863 Queue size is: 0
2014-06-07 14:17:43.057952 Queue size is: 0
[pid: 9879|app: 0|req: 6/6] 127.0.0.1 () {24 vars in 280 bytes} [Sat Jun  7 14:17:43 2014] POST /addMessage/X => generated 16 bytes in 0 msecs (HTTP/1.1 200) 2 headers in 71 bytes (1 switches on core 0)
2014-06-07 14:17:44.059037 Queue size is: 0
2014-06-07 14:17:45.060118 Queue size is: 0
[pid: 9879|app: 0|req: 7/7] 127.0.0.1 () {24 vars in 280 bytes} [Sat Jun  7 14:17:45 2014] POST /addMessage/X => generated 16 bytes in 0 msecs (HTTP/1.1 200) 2 headers in 71 bytes (1 switches on core 0)
2014-06-07 14:17:46.061205 Queue size is: 0
2014-06-07 14:17:47.062286 Queue size is: 0

Unter uwsgi wird im Hintergrund-Thread nicht dieselbe Warteschlange wie in der App angezeigt. Warum ist das so? Wie kann ich diese beiden Threads auf dasselbe Queue-Objekt anwenden?

Aktualisierung

Ich sehe ein inkonsistentes Verhalten, auch wenn es als Python-Skript ausgeführt wird: Manchmal gelingt es nicht, Nachrichten zu protokollieren (mitapp.logger), und ich kann nur sehenprints. Das bedeutet, dass der Thread läuft, aber nichts damit anfangen kannapp.logger.uwsgi.ini Aufbau
[uwsgi]
http-socket    = :9002
plugin         = python
wsgi-file      = /home/ubuntu/threadtest-uwsgi.py
enable-threads = true
workers        = 1
chdir          = /home/ubuntu/thread-tester/thread_tester
Code
from flask import Flask, jsonify
import Queue
from threading import Thread
import time
import datetime
import logging
import sys

logging.basicConfig(stream=sys.stderr,
                    format='%(asctime)s %(levelname)s - %(message)s')

app = Flask(__name__)
messages = Queue.Queue()

def print_queue_size():
    while True:
        app.logger.debug("%s Queue size is: %d" % (datetime.datetime.now(),
                                        messages.qsize()))
        time.sleep(1)

t = Thread(target=print_queue_size, args=())
t.setDaemon(True)
t.start()

@app.route("/queueSize", methods=["GET"])
def get_queue_size():
    return jsonify({"qsize": messages.qsize()}), 200

@app.route("/addMessage/<message>", methods=["POST"])
def add_message_to_queue(message):
    messages.put(message)
    return jsonify({"qsize": messages.qsize()}), 200

if __name__ == "__main__":
    app.run(port=6000)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage