Flask gevent 线程卡在 kafka 消费者上

Flask gevent threads are stuck on kafka consumer

我们有一个 flask 应用程序,在 gevent worker 模式下使用 gunicorn 进行部署。 该应用程序本身只听很少的 REST api,但它也有一个 kafka 消费者(使用融合客户端)。 当我们部署应用程序时,kafka 消费者按预期工作,但是当向应用程序提交 REST 请求时,应用程序没有处理它们。

似乎应用程序线程卡在了 kafka 消费者上。如果我们删除消费者代码,应用程序将按预期运行。

有什么建议吗?

问题是我们使用 kafka 消费者的方式是 "while True"

while True:
    msg = self.client.poll(1.0)
    if msg is None:
        continue
    if msg.error():
        print("Consumer error: {}".format(msg.error()))
        continue
    self.handle_msg(msg.value())

这导致 gevent 卡在上面而没有切换到其他线程。 解决方案是在消费者循环中添加一个睡眠命令,释放线程来处理 REST 请求