Сначала немного фона. Блокирующий сокет является сокетом по умолчанию, как только вы начинаете читать приложение или поток, не восстанавливает контроль до тех пор, пока данные на самом деле не будут прочитаны, или вы отсоедините. Это как python-requests
, работает по умолчанию. Существует отжиг, называемый grequests
, который обеспечивает неблокирующее считывание.
Основная механическая разница в том, что отправка, прием, подключение и прием может вернуться без каких-либо действий. У вас есть (конечно) номер вариантов. Вы можете проверить код возврата и коды ошибок, и обычно приводят себя в бешенство. Если вы не верите, попробуйте как-нибудь
Источник: https://docs.python.org/2/howto/sockets.html
Он также продолжает говорить:
Там нет сомнений, что самый быстрый сокеты код использует неблокирующая и выберите их мультиплексирование. Вы можете собрать что-то , которое насытит подключение к локальной сети, не создавая нагрузки на CPU . Беда в том, что приложение, написанное таким образом, не может делать ничего из что-нибудь еще - оно должно быть готово к случайному перетасовке байтов раз.
Предполагая, что ваше приложение на самом деле должны делать нечто большее, чем что, нарезание резьбы является оптимальным решением
Но вы хотите добавить целую кучу сложности вашей точки зрения, имея это порождение его собственной потоки. Особенно, когда стрельба async workers?
Доступны асинхронные рабочие люди на основе Greenlets (через Eventlet и Gevent). Greenlets - это реализация совместной многопоточной обработки для Python . В общем случае приложение должно иметь возможность использовать эти рабочие классы без каких-либо изменений.
и
Некоторые примеры поведения требуют асинхронных рабочих: Применение делая длинные блокирующие вызовы (например, внешние веб-сервисы)
Так вырезать длинную историю Короче говоря, дон» ничего не меняйте! Просто пусть это будет. Если вы внесете какие-либо изменения, пусть это будет ввести кэширование. Рассмотрите возможность использования Cache-control расширения, рекомендованного разработчиками python-запросов.
Что вы ожидаете отсюда? Вы ничего не можете вернуть клиенту, если вы еще не получили его. –
Я ожидал сделать его асинхронным, поэтому, когда он ждет супер медленного api, мощность процессора может использоваться для обработки других входящих запросов, которые могут потенциально к другому пути. (Поскольку я предполагаю, что это приложение получит много других разных входящих запросов) – JLTChiu
Это не значит, что вы думаете, что это значит. И Gunicorn * должен * обрабатывать это для вас, вы можете проверить, чтобы убедиться, что просто добавив 'time.sleep (30)' там, я думаю. Это называется моделью реактора, но Gunicorn позволяет клиенту подключиться, а затем передает запрос работнику. Когда работник заканчивает работу, он возвращает данные от рабочего и затем возвращает их обратно в пул. Я не уверен, что он закручивает нового рабочего, если все существующие уже заняты. –