LINUX.ORG.RU

[python][flask] Thread-local objects

 ,


0

1

Вычитал в документации по Flask следующее высказывание:

For example, Flask uses thread-local objects internally so that you don’t have to pass objects around from function to function within a request in order to stay threadsafe. While this is a really easy approach and saves you a lot of time, it might also cause some troubles for very large applications because changes on these thread-local objects can happen anywhere in the same thread.

Flask provides some tools to deal with the downsides of this approach but it might be an issue for larger applications because in theory modifications on these objects might happen anywhere in the same thread.

Что именно имелось в виду? Что такого критического может неожиданно произойти с этими thread-local объектами при достижении приложением статуса «very large»? И насколько большим должен быть проект, чтобы он мог считаться «very large»? Вообще, такое решение с tread-local объектами, насколько я понимаю, упрощает кое-какие моменты при разработке, но все же выглядит оно очень спорно. Единственная вещь, которая меня смутила во Flask, поправьте меня если я неправ.

PS: В Development потому что вопрос все-таки больше относится собственно к питону, чем к веб-разработке.

★★★★★

Насколько я понимаю идет речь о том, что тредлокал переменные хоть и локальные для треда, но все же являются глобальной для всего стека вызова фунцкий, обрабатывающих запрос. Особенно будет весело, когда имеется тредпул и один и тот же тред последовательно выполяет разные запросы. И каждый последующий тред видит в этих тредлокалах данные от предыдущего запроса.

В жаве я с этим боролся так: перед обработкой запроса запихивал в тредлокал немутабельные данные (например сессию) а по окончанию запроса чистил их.

dizza ★★★★★
()

>Вообще, такое решение с tread-local объектами, насколько я понимаю, упрощает кое-какие моменты при разработке, но все же выглядит оно очень спорно.

Вроде как ты не натолкнёшься на проблемы с ними, пока не начнёшь извращаться с внутренностями flask-а. В идеале надо просто ими пользоваться и не задумываться о всяком лишнем.

anonymous
()

There is only one limiting factor regarding scaling in Flask which are the context local proxies. They depend on context which in Flask is defined as being either a thread, process or greenlet. If your server uses some kind of concurrency that is not based on threads or greenlets, Flask will no longer be able to support these global proxies. However the majority of servers are using either threads, greenlets or separate processes to achieve concurrency which are all methods well supported by the underlying Werkzeug library.

А вообще, согласен, идея дурацкая, почему нельзя было передавать контекст через аргумент? А так очень сильно смахивает на костыли не понятно во имя чего. Проще код это не делает, совсем.

baverman ★★★
()

Вот еще откопал обсуждение. В общем судя по всему, пока сам не попробуешь написать large application на сабже, не узнаешь, насколько хорошо он для них подходит (:

pevzi ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.