Потокобезопасные веб-приложения - почему это важно? - PullRequest
3 голосов
/ 18 сентября 2010

Почему в веб-приложении важна поточнобезопасность?Pylons (веб-фреймворк Python) использует глобальную переменную приложения, которая не является поточно-ориентированной.Имеет ли это значение?Это проблема, только если я собираюсь использовать многопоточность?Или это означает, что один пользователь может не иметь обновленного состояния, если другой пользователь ... Я просто запутываю себя.Что в этом такого важного?

Ответы [ 5 ]

2 голосов
/ 18 сентября 2010

Ошибки потоков могут привести к серьезным и тонким проблемам.

Скажем, в вашей системе 10 участников.Еще один пользователь регистрируется в вашей системе, и приложение добавляет его в реестр и увеличивает количество членов;«одновременно», другой пользователь завершает работу, и приложение удаляет его из списка и уменьшает количество членов.

Если вы не обрабатываете потоки должным образом, количество ваших участников (которое должно быть 10) может легко составить девять, 10 или 11, и вы никогда не сможете воспроизвести ошибку .

Так что будьте осторожны.

1 голос
/ 19 сентября 2010

(Это было слишком долго, чтобы добавить комментарий к другим хорошим ответам.)

Проблемы параллелизма (читай: множественный доступ к общему состоянию) - это набор проблем с многопоточностью. (Проблемы параллелизма) могут легко существовать на уровне «выше потока», таком как уровень процесса / сервера (глобальная переменная в случае, который вы упомянули выше, является уникальным значением процесса, что, в свою очередь, может привести к противоречивому представлению / состоянию, если Есть несколько процессов).

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

Однако обратите внимание, что CPython запускает только один контекст потока для выполнения кода Python (чтобы получить истинные параллельные потоки, вам нужно писать / использовать расширения C), поэтому, пока вы можете получить форму состояния гонки для ожидаемых данных, вы выиграли не получают (все) один и тот же тип сценариев частичной записи и такие, которые могут мешать программам на C / C ++. Но, еще раз. Ошибка на стороне последовательного представления.

Существует целый ряд различных существующих методов создания доступа к глобальному атомарному - через потоки или процессы. Используйте их.

1 голос
/ 18 сентября 2010

Ваше веб-приложение почти всегда является многопоточным.Даже если вы не можете использовать потоки явно.Итак, чтобы ответить на ваши вопросы: это очень важно .

Как это может произойти?Обычно Apache (или IIS) обслуживает несколько запросов одновременно, вызывая несколько раз из нескольких потоков ваши программы на Python.Поэтому вы должны учитывать, что ваши программы работают одновременно в нескольких потоках и действуют соответственно.

1 голос
/ 18 сентября 2010

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

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

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

1 голос
/ 18 сентября 2010

Вы должны заботиться о безопасности нитей.Например, в Java вы пишете сервлет, который обеспечивает некоторую функциональность.Контейнер развернет экземпляр вашего сервлета, и, когда HTTP-запросы поступают от клиентов по разным TCP-соединениям, каждый запрос обрабатывается отдельным потоком, который, в свою очередь, вызывает ваш сервлет.В результате ваш сервлет будет вызываться из нескольких потоков.Таким образом, если он не является поточно-ориентированным, то ошибочный результат будет возвращен пользователю из-за повреждения данных при доступе к совместно используемым данным потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...