Web.py: невозможно получить многопоточное поведение с несколькими вкладками браузера - PullRequest
1 голос
/ 24 марта 2011

Я слышал, что Web.py по умолчанию является многопоточным веб-сервером. Так что создали простое приложение, которое спит минуту, прежде чем вернуть «Hello World».

Теперь, если я вызываю это приложение (то есть http://localhost:8080/) из двух разных браузеров почти одновременно, я получаю «Hello World» почти одновременно в обоих браузерах через 60 секунд - что указывает на многопоточность на конце Web.py работает нормально.

Но если я открою две вкладки в одном браузере и вызову один и тот же URL-адрес почти одновременно (с интервалом в несколько секунд), я получу «Hello world» на первой вкладке через 60 секунд, как и ожидалось, а затем «Hello World» во 2-й вкладке через 60 секунд после первого ответа. Это всего 120 секунд. Это указывает на то, что Web.py не выполняет многопоточность.

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

Есть идеи, как получить многопоточное поведение в этом случае? Или что я делаю не так? Нужна ли какая-либо специальная конфигурация web.py? Или любой другой (простой) веб-фреймворк, который будет делать то, что я ожидаю.

1 Ответ

5 голосов
/ 24 марта 2011

Поведение, которое вы описываете, похоже, характерно для определенных браузеров. Потратив время на воссоздание вашей ситуации, т. Е. Создав простое приложение web.py, которое некоторое время спит, прежде чем ответить на запрос, я смог воссоздать проблему - в Firefox. Попытка сделать то же самое в IE8 с использованием двух вкладок фактически привела к первоначально ожидаемому результату: оба запроса обрабатываются одновременно.

Это наводит меня на мысль, что проблема связана с браузером, а не с web.py. Скорее всего, некоторые браузеры будут помещать в очередь запросы, сделанные на один и тот же URL-адрес или домен, а не отправлять их все сразу.

Многопоточное или многопроцессорное приложение Python не должно страдать от той же проблемы.

Для справки это простое приложение web.py, которое я создал с использованием основного учебника:

#!/usr/bin/env python

import time, web

urls = (
  '/', 'index'
)

web.config.debug = False
app = web.application(urls, globals())

class index:
    def GET(self):
        time.sleep(10)
        return "Hello, world!"

if __name__ == "__main__":
    app.run()
...