Форум сайта python.su
Андрей СветловЛучше сказать не одновременно, а поочередно (поток то один).
Каким образом в одном потоке может работать несколько wsgi application одновременно?
# coding: utf8
from bottle import default_app, request, get
@get('/')
def main():
from random import randint
if 'my_local' not in request: request['my_local'] = randint(0,100)
return str(request['my_local'])
# emulate wsgi
Stream = type('MyStream',(object,),{ 'write':lambda a,b:None })
start_response = lambda status,response:None
application = default_app()
# 5 questions
envs = map(lambda x:{ 'wsgi.errors':Stream() },xrange(5))
# 3 cycle
for i in xrange(3):
print [application(environ, start_response) for environ in envs]
[['62'], ['50'], ['26'], ['4'], ['67']]
[['62'], ['50'], ['26'], ['4'], ['67']]
[['62'], ['50'], ['26'], ['4'], ['67']]
if 'my_local' not in request: request['my_local'] = randint(0,100)
Офлайн
Андрей Светловкстати, wsgi не уничтожает созданные потоки, он передает новые запросы в старые потоки. т.е. один и тот же поток обрабатывает множество запросов, только каждый запрос обрабатывается единожды.
Каким образом в одном потоке может работать несколько wsgi application одновременно?
Офлайн
o7412369815963Ключевое слово - одновременно - подразумевается что в одном потоке (процессе?) одновременно работает одно приложение, формально wsgi приложение должно работать и при multithread, и при multiprocess, и run_once. Т.е. нигде не сказано (run_once не гарантируется) как оно будет запущено, и будет ли поток переиспользован или нет - это вопрос реализации сервера - который нас не должен интересовать.
он передает новые запросы в старые потоки
class IRequestListener(Interface):
'''Request listener
'''
def before_request(context, request):
"""Call before request"""
def after_request(context, response):
"""Call after request"""
class ITemplateRenderListener(Interface):
'''Template render notifications
'''
def template_rendered(template, context):
"""Called when template rendered"""
def update_template_context(context):
"""Update the template context with some
commonly used variables."""
Офлайн
Есть еще такие понятия как декомпозиция и тестирование. В этом плане thread locals недалеко ушли от глобальных переменных.
Офлайн
zheromoнаоборот, в одном потоке несколько приложений “одновременно”. (про это разговор, иначе “кина” бы не было)
Ключевое слово - одновременно - подразумевается что в одном потоке (процессе?) одновременно работает одно приложение
Офлайн
o7412369815963ну почему же
имхо, высосано из пальца
Офлайн
o7412369815963Ну а я о чем?
.е. наподобие событийно ориентированного: запрос 1 прилетел, поработали с ним, отправили команду в БД, что-б не простаивать принимаем запрос 2 в это же поток, когда ответ из БД пришел даем управление запросу 1.
Офлайн
Андрей СветловМожет потому что на низком уровне нет волшебного “тред локал”. В GUI наверно так удобнее, передача параметров из ф-ии в ф-ию идет с преобразованием параметров, например влетает 4 DWORD, а в OnMouseMove приходит x,y,prm. + там не используются паттерны типа IoC. А вообще это другая сфера, хоть и есть похожие моменты.
Почему во всех GUI события приходят в обработчики как параметры, а не хранятся в глобальном объекте? Это был как-бы намёк.
Офлайн
IoC — это inversion of control? А почему в GUI его нет? С моей точки зрения — как раз классический случай.
Я не настаиваю, но мне кажется что различий меньше чем сходства.
Как по мне, thread locals для request/response не являются мировым злом, — но есть и более удачные варианты.
Офлайн
Андрей Светлов?
Реализовав их, например, в том же nginx - он ведь от рождения неблокирующий?
Офлайн