Чтение веб-сайта с asyncore

Можно использовать 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, метод ожидает при необходимости в течение самое большее данного времени для этого будущего для завершения и затем возвращает свой результат при наличии.

7
задан Tom 2 September 2009 в 12:39
поделиться

3 ответа

Вы смотрели http://asynchttp.sourceforge.net/ ?

«Асинхронный HTTP-клиент для Python.

Модуль« asynchttp »является логическим расширением модуля« asynchat »библиотеки Python, который построен на модулях« asyncore »и« select ». Наша цель - предоставить функциональность превосходного модуля httplib без использования блокирующих сокетов. "

Последний коммит проекта был 2001-05-29, так что он выглядит мертвым. Но в любом случае это может быть интересно.

Заявление об ограничении ответственности: я сам не использовал его.

Кроме того, это сообщение в блоге содержит некоторую информацию об асинхронном HTTP.

5
ответ дан 6 December 2019 в 15:24
поделиться

Вы можете реализовать асинхронный вызов самостоятельно. Для каждого вызова запускайте новый поток (или попробуйте получить его из пула) и используйте обратный вызов для его обработки.

Вы можете сделать это очень хорошо с помощью декоратора:

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
7
ответ дан 6 December 2019 в 15:24
поделиться

Самый дальний Я пришел с использованием модифицированного asynchttp, как предполагал этот код. Я пробовал использовать как asyncore / asynchat, так и asynchttp, но с большим трудом. Мне потребовалось слишком много времени, чтобы попытаться исправить все ошибки в нем (есть метод handle_read, почти скопированный из asyncore, только с плохим отступом и доставляющий мне головную боль с фрагментированным кодированием). Кроме того, asyncore и asynchat лучше не использовать в соответствии с некоторыми подсказками, которые я получил в Google.

Я решил использовать twisted, но это, очевидно, для вас не может быть и речи.

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

1
ответ дан 6 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: