Можно использовать CompletableFuture
с ExecutorService
(как отмечалось ранее), который немного более изящен. Вот пример,
ExecutorService executor = Executors.newCachedThreadPool();
CompletableFuture<Response> future = CompletableFuture.supplyAsync(() ->
builder.post(Entity.json(new Gson().toJson(request))), executor);
Response response = null;
try {
response = future.get(timeout, TimeUnit.SECONDS);
} catch (Exception e) {
log.debug("Encountered error while calling payment processor", e);
}
Согласно Javadoc, get
, метод ожидает при необходимости в течение самое большее данного времени для этого будущего для завершения и затем возвращает свой результат при наличии.
Вы смотрели http://asynchttp.sourceforge.net/ ?
«Асинхронный HTTP-клиент для Python.
Модуль« asynchttp »является логическим расширением модуля« asynchat »библиотеки Python, который построен на модулях« asyncore »и« select ». Наша цель - предоставить функциональность превосходного модуля httplib без использования блокирующих сокетов. "
Последний коммит проекта был 2001-05-29, так что он выглядит мертвым. Но в любом случае это может быть интересно.
Заявление об ограничении ответственности: я сам не использовал его.
Кроме того, это сообщение в блоге содержит некоторую информацию об асинхронном HTTP.
Вы можете реализовать асинхронный вызов самостоятельно. Для каждого вызова запускайте новый поток (или попробуйте получить его из пула) и используйте обратный вызов для его обработки.
Вы можете сделать это очень хорошо с помощью декоратора:
def threaded(callback=lambda *args, **kwargs: None, daemonic=False):
"""Decorate a function to run in its own thread and report the result
by calling callback with it."""
def innerDecorator(func):
def inner(*args, **kwargs):
target = lambda: callback(func(*args, **kwargs))
t = threading.Thread(target=target)
t.setDaemon(daemonic)
t.start()
return inner
return innerDecorator
@threaded()
def get_webpage(url):
data = urllib.urlopen(url).read()
print data
Самый дальний Я пришел с использованием модифицированного asynchttp, как предполагал этот код. Я пробовал использовать как asyncore / asynchat, так и asynchttp, но с большим трудом. Мне потребовалось слишком много времени, чтобы попытаться исправить все ошибки в нем (есть метод handle_read, почти скопированный из asyncore, только с плохим отступом и доставляющий мне головную боль с фрагментированным кодированием). Кроме того, asyncore и asynchat лучше не использовать в соответствии с некоторыми подсказками, которые я получил в Google.
Я решил использовать twisted, но это, очевидно, для вас не может быть и речи.
Это также может зависеть от того, что вы пытаетесь сделать с вашим приложением и почему вам нужны асинхронные запросы, если потоки являются вариантом или нет, если вы вы занимаетесь программированием с графическим интерфейсом или чем-то еще, так что если вы можете пролить дополнительную информацию, это всегда хорошо. Если нет, я бы проголосовал за предложенную выше многопоточную версию, она обеспечивает гораздо большую удобочитаемость и удобство сопровождения.