python – Flask:后台线程看到一个非空队列为空

python – Flask:后台线程看到一个非空队列为空,第1张

概述当我在uwsgi中运行Flask应用程序时,后台线程和应用程序功能在查询相同队列的大小时会看到不同的值. 组件 >具有thread-safe queue的Flask应用程序. > GET调用返回队列大小. > POST调用向队列中添加一个元素. >后台线程打印队列大小 问题 当应用程序是从shell使用python tester.py时,我得到预期的结果: 2014-06-07 14:20:50. 当我在uwsgi中运行Flask应用程序时,后台线程和应用程序功能在查询相同队列的大小时会看到不同的值.

组件

>具有thread-safe queue的Flask应用程序.
> GET调用返回队列大小.
> POST调用向队列中添加一个元素.
>后台线程打印队列大小

问题

当应用程序是从shell使用python tester.py时,我得到预期的结果:

2014-06-07 14:20:50.677995 Queue size is: 0127.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: 12014-06-07 14:20:52.680425 Queue size is: 12014-06-07 14:20:53.681566 Queue size is: 12014-06-07 14:20:54.682708 Queue size is: 1127.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: 22014-06-07 14:20:56.688867 Queue size is: 2

但是,当使用uwsgi执行应用程序时,我在日志中得到以下内容:

2014-06-07 14:17:42.056863 Queue size is: 02014-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: 02014-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: 02014-06-07 14:17:47.062286 Queue size is: 0

当在uwsgi下运行时,后台线程看不到与应用程序相同的队列.这是为什么?我怎么能让这两个线程看同一个Queue对象?

更新

>即使将其作为Python脚本执行,我也看到不一致的行为:有时它不会记录消息(使用app.logger),我只能看到打印.这意味着线程正在运行,但它不能与app.logger做任何事情.

uwsgi .ini配置

[uwsgi]http-socket    = :9002plugin         = pythonwsgi-file      = /home/ubuntu/threadtest-uwsgi.pyenable-threads = trueworkers        = 1chdir          = /home/ubuntu/thread-tester/thread_tester

from flask import Flask,Jsonifyimport Queuefrom threading import Threadimport timeimport datetimeimport loggingimport syslogging.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()}),200if __name__ == "__main__":    app.run(port=6000)
解决方法 从 Things to Know documenation page:

uWsgi trIEs to (ab)use the copy On Write semantics of the fork() call whenever possible. By default it will fork after having loaded your applications to share as much of their memory as possible. If this behavior is undesirable for some reason,use the lazy option. This will instruct uWsgi to load the applications after each worker’s fork(). Lazy mode changes the way graceful reloading works: instead of reloading the whole instance,each worker is reloaded in chain. If you want “lazy app loading”,but want to maintain the standard uWsgi reloading behavIoUr,starting from 1.3 you can use the lazy-apps option.

您的Flask应用程序在uWsgi启动时启动,然后分配一个工作进程.在分叉时,队列对象为空,不再与原始进程共享.线没有走.

尝试设置lazy-apps option以延迟加载Flask应用程序,直到工作人员启动.

总结

以上是内存溢出为你收集整理的python – Flask:后台线程看到一个非空队列为空全部内容,希望文章能够帮你解决python – Flask:后台线程看到一个非空队列为空所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1207206.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存