Почему Flask зависает при использовании инстанцирования торнадо IOloop внутри __init__ приложения Flask? - PullRequest
0 голосов
/ 26 сентября 2018

Я пытался настроить мой jaeger_client трассировщик внутри моего Flask приложения __init__ (полученного из Flask), и приложение продолжало зависать после запуска from tornado.platform.epoll import EPollIOLoop внутри ioloop.py строки 243 (tornado==4.5.3).

Это оригинальный фрагмент кода внутри __init__, который вызвал зависание:

tracer_config = Config(
config={
    'sampler': {'type': 'const', 'param': 1},
    'local_agent': {'reporting_host': '<SOME_IP>'},
    'logging': True
},
service_name='hello-world')
self.tracer = tracer_config.initialize_tracer()

Я не мог понять, почему и в конечном итоге сузил его до этого кода, который также зависает:

from flask import Flask
from tornado import ioloop
from threading import Thread


def foo():
    return ioloop.IOLoop()


class A(Flask):
    def __init__(self):
        super(A, self).__init__(__name__)
        print("Initializing...")
        t = Thread(target=foo)
        t.start()
        t.join()
        print("Done initializing.")


app = A()

Выполнение следующего (при условии, что имя сценария test.py) ясно покажет зависание:

#/bin/sh
FLASK_APP=test.py flask run

(Flask 1.0.2)

ЛюбойИдея, что вызывает зависание?

Решение проблемы инициализации jaeger_client

Я в конечном итоге использовал встроенную функцию Flask self.before_first_request(self._init_jeager_tracer) внутри __init__чтобы убедиться, что трассировщик инициализируется до поступления любого запроса. Где _init_jeager_tracer - функция инициализации трассировщика.

...