Многопоточность и асинхронные сокеты в Python - PullRequest
1 голос
/ 21 марта 2012

Я довольно новичок в потоке Python / сетевом программировании, но у меня есть задание, включающее оба вышеперечисленных.Одним из требований назначения является то, что для каждого нового запроса я создаю новый поток, но мне нужно одновременно отправлять и получать в браузер.В настоящее время я использую библиотеку asyncore в Python для перехвата каждого запроса, но, как я уже сказал, мне нужно порождать поток для каждого запроса, и мне было интересно, является ли использование как потока, так и асинхронного излишним, или правильный способсделай это?Любой совет будет принят во внимание.Спасибо

РЕДАКТИРОВАТЬ: я пишу прокси-сервер, и не уверен, что мой клиент является постоянным.Мой клиент - мой браузер (для простоты использую firefox). Кажется, он переподключается для каждого запроса.Моя проблема в том, что если я открою вкладку с http://www.google.com и http://www.stackoverflow.com, я получу только один запрос за раз от каждой вкладки, вместо нескольких запросов от Google и изSO.

1 Ответ

1 голос
/ 21 марта 2012

Я ответил на вопрос, который звучит удивительно похоже на ваш, когда кто-то выполнил домашнее задание для создания настройки клиентского сервера, при этом каждое соединение обрабатывалось в новой теме: https://stackoverflow.com/a/9522339/496445

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

Дополнительный бит об асинхронности против потоков

Из асинхронных документов :

Есть только два способа сделать программу на одном процессоре «Несколько вещей одновременно». Многопоточное программирование - это Самый простой и популярный способ сделать это, но есть еще один очень другой метод, который позволяет вам иметь почти все преимущества многопоточность, без использования нескольких потоков. Это правда только практично, если ваша программа в основном связана с вводом / выводом. Если ваша программа привязан к процессору, то приоритетные запланированные потоки, вероятно, что тебе действительно нужно Сетевые серверы редко связаны с процессором, однако.

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

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

...