который является минималистическим Python wsgi сервер разработки с поддержкой перезагрузки кода? [закрытый]

10
задан 3 revs, 2 users 100% 20 November 2013 в 16:52
поделиться

7 ответов

Одним из действительно простых способов является CGI (вместе с обычным веб-сервером, и используя wsgiref.handlers.CGIHandler). Ужасно для производительности на производственном сервере, но отлично подходит для разработки. Вы можете написать один скрипт, который работает и как mod_wsgi WSGIScriptAlias (открывающий объект application), и как mod_cgi ScriptAlias (вызывающий wsgiref, когда __name__=='__main__').

Во многих средах WSGI есть способ перезагрузки базового скрипта, например, mod_wsgi's WSGIScriptReload, который включен по умолчанию. К сожалению, вы, скорее всего, поместите большую часть своего кода в модули, что не так просто перезагрузить. В mod_wsgi вы также можете сделать это, отправив SIGINT для выполнения перезагрузки, когда находитесь в демоническом режиме. К сожалению, вам все равно придется прослушивать каждый модуль, который вы используете для обновления mtime, чтобы узнать, нужно ли вам перезагружать. И это не работает во встроенном режиме.

Грязный, но реально осуществимый подход - это прослушивание всех модулей, которые являются частью вашего приложения, и если они были обновлены с момента последней проверки, перезагрузите их все. Вы должны перезагрузить их сразу, удалив их все из поиска sys.modules (удалите None-значимые записи тоже, пока вы там находитесь, чтобы избежать относительных проблем с импортом), чтобы убедиться, что они не содержат перекрестных ссылок на старые версии самих себя. И, конечно же, они не должны оставлять других ссылок на себя за пределами вашего приложения. Пример этого можно посмотреть в действии в классе ModuleUpdater здесь .

(Это программное обеспечение не готово к выпуску, но обеспечивает перезагрузку модулей для моих WSGI приложений в течение нескольких лет и кажется стабильным. Идея заключается в том, чтобы поместить все ваши WSGI приложения в класс приложений в пакете, который можно импортировать из одного сценария точки входа WSGI/CGI/командной строки; вы включаете конфигурацию установки в этот сценарий)

.
1
ответ дан 4 December 2019 в 00:24
поделиться

Используйте фоновый рабочий и только чтение ограниченного числа строк. Дополнительная информация доступна только при прокрутке пользователем.

И постарайтесь никогда не использовать ReadToEnd (). Это одна из функций, которые вы думаете, «почему они сделали это?»; это помощник по сценарию ', который хорошо справляется с мелочами, но, как видите, он отстой для больших файлов...

Те ребята, которые говорят вам использовать StringBuilder, должны чаще читать MSDN:

Соображения по производительности
Методы Concat и AppendFormat соединяют новые данные с существующим объектом String или StringBuilder. Операция конкатенации последовательностей всегда создает новый объект из существующей последовательности и новых данных. Объект StringBuilder поддерживает буфер для согласования новых данных. Новые данные добавляются в конец буфера, если имеется комната; в противном случае выделяется новый больший буфер, данные из исходного буфера копируются в новый буфер, затем новые данные добавляются в новый буфер. Производительность операции конкатенации для объекта String или StringBuilder зависит от частоты выделения памяти.
Операция конкатенации Последовательности всегда выделяет память, в то время как операция конкатенации StringBuilder выделяет память только в том случае, если буфер объекта StringBuilder слишком мал для размещения новых данных. Следовательно, класс String предпочтительнее для операции конкатенации, если объединено фиксированное число последовательностей. В этом случае отдельные операции конкатенации могут даже объединяться компилятором в одну операцию. Объект StringBuilder предпочтителен для операции конкатенации, если сцеплено произвольное число последовательностей; например, если цикл объединяет случайное число последовательностей пользовательского ввода.

Это означает огромное выделение памяти, то, что становится большим использованием системы файлов подкачки, которая имитирует секции жесткого диска, чтобы действовать как память ОЗУ, но жесткий диск очень медленный.

Параметр StringBuilder подходит для тех, кто использует систему в качестве однопользовательской, но при одновременном чтении больших файлов двумя или более пользователями возникает проблема.

-121--799083-

Возможно, вам лучше использовать файлы с отображением памяти здесь .. Поддержка отображенных файлов в памяти будет около в .NET 4 (я думаю... я слышал, что через кого-то еще говорит об этом), следовательно, эта обертка, которая использует p/invoks для выполнения той же работы..

Правка: См. здесь, на MSDN , описание работы блога , указывающее, как она выполняется в предстоящем 4 .NET, когда она выходит в качестве версии. Ссылка, которую я дал ранее, является оберткой вокруг pinvoke для достижения этого. Можно отобразить весь файл в память и просмотреть его как скользящее окно при прокрутке файла.

-121--799086-

Я бы рекомендовал пасту или CherryPy. С ними легче всего вставать и бегать.

1
ответ дан 4 December 2019 в 00:24
поделиться

Один, который вы можете посмотреть на Werkzeug - это инструментарий WSGI Utility. Он включает в себя функцию Runserver, которая принимает сервер WSGIREF и добавляет автоматическую перезарядку кода (вы также можете настроить его для перезагрузки при изменении файлов конфигурации) и потрясающий отладчик.

На боковой заметке ваша презрение для Frameworks делает его звучащим, как вы планируете обрабатывать все материалы WSGI с нуля, в этом случае я бы порекомендовал использовать функции утилиты Werkzeug для обработки запросов на анализ и генерирующие ответы. Это намного веселее, чем делать это самостоятельно. (И для любви к Гвидо, пожалуйста, не используйте CGI.FieldStorage !)

4
ответ дан 4 December 2019 в 00:24
поделиться

До сих пор я использовал CherryPy, и по сравнению с Django (который, хотя и не в вашем списке, является единственным другим сервером dev, который я использовал) мне он нравится больше. Он делает то, что говорит: он находится там только тогда, когда вам нужно, и убирается с дороги до конца времени.

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

1
ответ дан 4 December 2019 в 00:24
поделиться

Взгляните на run_simple из werkzeug:

http://werkzeug.pocoo.org/documentation/0.5.1/serving.html

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

4
ответ дан 4 December 2019 в 00:24
поделиться

Можно использовать paste.reloader с любым wsgi-сервером, кроме других модулей вставки.

# run paste reloader
import paste.reloader as reloader
reloader.install()

# run wsgiref server
from wsgiref import simple_server
simple_server.make_server('', 8080, main_wsgi_app).serve_forever()

Достаточно ли это минималистично?

-121--3153503-

См. раздел http://lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html

Задача состоит в том, чтобы определить EXCLUDED_SOURCE_FILE_NAMES в конфигурации, из которой требуется исключить файлы, и задать значение этого пользовательского параметра построения для списка имен файлов (или образец, который соответствует этим именам и только именам файлов).

-121--2443134-

Кроме того, вы пропустили web.py, который является небольшим и поддерживает перезагрузку кода.

1
ответ дан 4 December 2019 в 00:24
поделиться

Вы можете использовать paste.reloader с любым wsgi-сервером, не считая других модулей paste.

# run paste reloader
import paste.reloader as reloader
reloader.install()

# run wsgiref server
from wsgiref import simple_server
simple_server.make_server('', 8080, main_wsgi_app).serve_forever()

Это достаточно минималистично?

0
ответ дан 4 December 2019 в 00:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: