Werkzeug Basewsgiserver Thread висит после запроса на обработку. Терминал не отвечаетPython

Программы на Python
Ответить
Anonymous
 Werkzeug Basewsgiserver Thread висит после запроса на обработку. Терминал не отвечает

Сообщение Anonymous »

Это помешало мне делать что -то полезное в течение более недели - если у вас есть опыт работы с Python/Werkzeug/Flask/Multi -Threading, пожалуйста, помогите ...
Теперь, Обычно вы запускаете приложение Flask в отдельном терминале через py flask.py , необходимо вручную развернуть его и вручную выключить с помощью ctrl-c . Мое приложение Python требует только этого локального сервера в определенных случаях, например: для получения токена с использованием потока кода авторизации Spotify, чтобы позже я мог сделать допустимые запросы, используя их веб -API. < /P>
my < em> auth_server.py файл является «разделом», ответственным за все это. Здесь живет класс под названием localerverthread , этот подклассы Thread , взятый из слов для слов из этого ответа. 8 лет назад это был единственный полезный ответ для окон в море дерьма; Увы, к сожалению, сегодня это всего лишь частично работающий пример.

Код: Выделить всё

from werkzeug.serving import make_server

class ServerThread(threading.Thread):
THREAD_NAME = 'LocalServerThread'

def __init__(self, app):
threading.Thread.__init__(self, name=LocalServerThread.THREAD_NAME)
self.server = make_server('127.0.0.1', 8080, app)
self.ctx = app.app_context()
self.ctx.push()

def run(self):
log.info('starting server')
self.server.serve_forever()

def shutdown(self):
self.server.shutdown()

def start_server():
global server
app = flask.Flask('myapp')
# App routes defined here
server = ServerThread(app)
server.start()
log.info('server started')

def stop_server():
global server
server.shutdown()
Вот остальная часть рассматриваемого кода в моем auth_server.py :

Код: Выделить всё

def start_local_http_server():
app = Flask(__name__)

@app.route('/')
def home():

@app.route('/login')
def login():

@app.route('/callback')
def callback():

global server
server = LocalServerThread(app)
server.start()
print(fr'Started {LocalServerThread.THREAD_NAME}, serving: http://127.0.0.1:8080')

def stop_local_http_server():
server.shutdown()
Вот мой реальный код из main.py, который использует этот код:

Код: Выделить всё

if not auth_server.validate_token(reject=True):
auth_server.start_local_http_server()

time.sleep(4)

auth_server.stop_local_http_server()

print('Finally Done')
Теперь вот где все это разваливается ...

Я запускаю его с py ./main.py. Если я просто позволю ему работать, выключение будет работать отлично, правильно закрыв все. Хорошо.

Однако, если, в то время как основной поток спит за эти 4 секунды, я перехожу на любой из маршрутов ('/', '/login', '/callback') и сервера Успешно обслуживает мне страницу, а затем, когда программа достигает самостоятельного. SELU.Server.shutdown () , она просто будет зависать там где-нибудь от 90-300 секунд, прежде чем, наконец, выходит и достигнет печати («Наконец-то сделано») Вернуться в главную ветку. В течение этого времени терминал будет выглядеть так, отказываясь позволить программе выходить из программы:
< /p>
Это бельет в белье. Я не могу понять, что, черт возьми, идет во время отладки. self.server.shutdown () углубляется в socketserver.py baseServer shutdown (), и я не могу войти в Что -то дальше, чем две строки внутри, как будто оно что -то ждет ... но я получил вам стек вызовов: < /p>
Это стеки вызовов рядом, прямо перед Отладка теряет отслеживание того, что происходит.

First: Standard Run. ________________________ Второе: переход на '/' во время сон 4sec:



Примечание: < /strong> еще раз, я нахожусь в Windows.

Есть ли кто -нибудь, кто смотрит на это, у которого есть знания /опыт, чтобы увидеть проблему? Это действительно поможет не только мне, но и наше потомство, я подозреваю ...

Подробнее здесь: https://stackoverflow.com/questions/793 ... unresponsi
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»