我有一个使用gunicorn部署的Flask应用程序。我想使用 kazoo 将应用程序与 Zookeeper 集成集成,因为该应用程序依赖于从 Znode 之一上的 get_children() 调用获取最新数据。
我的一个选择是让应用程序每次使用数据之前都获取数据。数据不会经常更改,因此效率很低。我不想轮询 Zookeeper,而是想在应用程序启动时使用监视函数调用 get_children(),以便在数据发生更改时回调该监视函数。
我的问题是,我在哪里有效地设置这个手表功能以确保它在应用程序运行时被调用?我应该在应用程序的主文件(传递给gunicorn命令的文件)中设置它吗?我想我很困惑当应用程序在 Gunicorn 中运行时哪个线程将运行 watch 函数。
我通过进一步研究找到了答案。 kazoo 库允许在创建 KazooClient 对象时传递处理程序对象。默认处理程序是 SequentialThreadingHandler,它将在 kazoo 与主线程分开创建的线程中运行监视函数。
SequentialThreadingHandler 在我的 Flask + Gunicorn 设置中工作。当使用此处理程序时,每个gunicorn工作进程都会为监视函数创建一个单独的线程。