Параллельные GET-запросы aiohttp приводят к ClientConnectorError (8, «имя узла или имя сервера указано или не известно»)

Я сделал это раньше для своей Dropzone. Не стесняйтесь настраивать. Это из моего приложения Laravel. Вы должны сосредоточиться на avatar_refresh_upload.

function avatar_refresh_upload() {
    var input = $('input#avatar[type=file]');

    input.replaceWith(input.val('').clone(true));

    $('#selected_file').html('{{ Lang::get('app.profile_avatar_select') }}');
    $('#avatar_refresh_upload').removeAttr('style');
}

$(document).ready(function ($) {

    $('input:file#avatar').change(function () {
        var file_name = $(this).val();
        if (file_name.length > 10) {
            file_name = file_name.substring(0, 10) + '...';
        }
        $('#selected_file').html('File "' + file_name + '" chosen');
        $('#avatar_refresh_upload').css('display', 'inline-block');
    });

    $('#avatar_refresh_upload').on('click', function () {
        avatar_refresh_upload();
    });

    @if ($user->avatar != '')
    $('#remove_avatar').change(function () {

        if ($(this).is(':checked')) {

            avatar_refresh_upload();
            $('#avatar').prop('disabled', true);
            $('#avatar_preview').css('opacity', '0.5');
            $('#avatar_upload_form_area').css('opacity', '0.5');
            $('#remove_avatar_info').show();

        } else {

            $('#avatar').prop('disabled', false);
            $('#avatar_preview').removeAttr('style');
            $('#avatar_upload_form_area').removeAttr('style');
            $('#remove_avatar_info').removeAttr('style');

        }
    });
    @endif

});

Короче говоря, если вы хотите сбросить входной файл после того, как вы выбрали файл для загрузки, но перед отправкой вам нужно запустить:

input.replaceWith(input.val('').clone(true));
6
задан Brad Solomon 16 January 2019 в 02:53
поделиться

1 ответ

После некоторого дальнейшего исследования эта проблема, по-видимому, не вызвана непосредственно aiohttp / asyncio, а скорее ограничениями / ограничениями, вытекающими из обоих:

  • Ограничение пропускной способности / скорости ваши DNS-серверы
  • Максимальное количество открытых файлов на системном уровне.

Во-первых, для тех, кто хочет получить некоторые усиленные DNS-серверы (я, вероятно, не буду идти по этому пути), варианты с громкими именами выглядят так:

  • 1.1.1.1 (Cloudflare)
  • 8.8.8.8 (Google Public DNS)
  • Amazon Route 53

( Хорошее введение в DNS для таких, как я для которых отсутствуют сетевые концепции.)

Первое, что я сделал, - запустил вышеописанное на расширенном экземпляре AWS EC2 - h1.16xlarge с Ubuntu, оптимизированной для ввода-вывода. Я не могу сказать, что это само по себе помогло, но это, конечно, не повредит. Я не слишком знаком с DNS-сервером по умолчанию, используемым экземпляром EC2, но ошибка OSError с errno == 8, приведенная выше, исчезла при репликации вышеуказанного сценария.

Однако, на его месте появилось новое исключение, OSError с кодом 24, «Слишком много открытых файлов». Мое решение исправления (не утверждая, что это самый устойчивый или самый безопасный) состояло в том, чтобы увеличить максимальные пределы файла. Я сделал это через:

sudo vim /etc/security/limits.conf
# Add these lines
root    soft    nofile  100000
root    hard    nofile  100000
ubuntu    soft    nofile  100000
ubuntu    hard    nofile  100000

sudo vim /etc/sysctl.conf
# Add this line
fs.file-max = 2097152

sudo sysctl -p

sudo vim /etc/pam.d/commmon_session
# Add this line
session required pam_limits.so

sudo reboot

Я по общему признанию чувствую себя вокруг в темноте, но соединение этого с asyncio.Semaphore(1024) (пример здесь ) привело к ровно 0 из любых двух исключений выше

# Then call this from bulk_get with asyncio.Sempahore(n)
async def bounded_get(sem, url, session) -> str:
    async with sem:
        return await get(url, session)

Из ~ 25 тыс. входных URL-адресов только ~ 100 GET-запросов возвращали исключения, в основном из-за того, что сайты законно ломались, а общее время до завершения приходило в течение нескольких минут, что приемлемо в Мое мнение.

0
ответ дан Brad Solomon 16 January 2019 в 02:53
поделиться
Другие вопросы по тегам:

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