Пример многопоточности Cherrypy - PullRequest
6 голосов
/ 02 июля 2010

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

def testPage(self, *args, **kwargs):
    current = threading.currentThread()
    print 'Starting ' , current
    time.sleep(5)
    print 'Ending ' ,current
    return '<html>Hello World</html>'

Теперь допустим, что я запускаю свою страницу как http://localhost:6060/root/testPage в 3-4 вкладках браузера.Какой результат я получаю

Starting <WorkerThread(CP WSGIServer Thread-10, started 4844)>
Ending <WorkerThread(CP WSGIServer Thread-10, started 4844)>
Starting <WorkerThread(CP WSGIServer Thread-7, started 4841)>
Ending <WorkerThread(CP WSGIServer Thread-7, started 4841)>
Starting <WorkerThread(CP WSGIServer Thread-10, started 4844)>
Ending <WorkerThread(CP WSGIServer Thread-10, started 4844)>

Я четко понимаю, что это создает новые потоки для обработки каждого нового запроса, но я не могу понять, почему каждый раз, когда я получаюначиная ... ending..starting..endingи почему бы не начать ... начало .. конец .. конец иногдаПотому что я предполагаю, что time.sleep заставит один поток приостановить, а другой сможет выполнить в это время.

1 Ответ

2 голосов
/ 02 июля 2010

Это почти наверняка ограничение вашего браузера, а не CherryPy. Например, Firefox 2 будет выполнять не более 2 одновременных запросов к одному домену, даже с несколькими вкладками. И если каждая вкладка также извлекает значок, который оставляет по одному обработчику за раз.

См. http://www.cherrypy.org/ticket/550 для заявки с аналогичным исходным кодом и более длинным доказательством.

...