可以在Flask应用程序中将threading.local()用于请求吗?

时间:2019-05-23 11:14:09

标签: python flask gunicorn python-multithreading gevent

我有一个烧瓶服务,我想为所有日志消息记录一个correlationID。我发现this blog post使用了threading.local()

我的Flask服务使用gunicorn和gevent:

gunicorn --worker-class=gevent \
         --worker-connections=1000 \
         --bind 0.0.0.0:5000 myapp.app:app
         --workers=4 --timeout 120 --keep-alive 120

threading.local()可以用于请求吗?

我猜...

  1. 每个工人是一个不同的过程,并且
  2. 每个连接都是不同的线程,并且
  3. 如果我没有明确启动另一个线程,每个请求都在一个线程上?

但是当我启动另一个线程时,我需要显式地传递correlationId,对吧?

(如果重要的话:我使用Python 3.7)

1 个答案:

答案 0 :(得分:0)

如果您要问是否可以使用线程局部变量来传递请求对象,那是flask在内部所做的事情。

# context locals
_request_ctx_stack = LocalStack()
_app_ctx_stack = LocalStack()
current_app = LocalProxy(_find_app)
request = LocalProxy(partial(_lookup_req_object, 'request')) # Here
session = LocalProxy(partial(_lookup_req_object, 'session'))
g = LocalProxy(partial(_lookup_app_object, 'g'))

如果您要问是否可以从线程本地变量中传递您自己的对象,那么您也可以这样做,因为这基本上是flask的工作。

但是很明显,烧瓶建议使用werkzeug.local

https://werkzeug.palletsprojects.com/en/0.15.x/local/