После некоторого дальнейшего исследования эта проблема, по-видимому, не вызвана непосредственно aiohttp
/ asyncio
, а скорее ограничениями / ограничениями, вытекающими из обоих:
Во-первых, для тех, кто хочет получить некоторые усиленные DNS-серверы (я, вероятно, не буду идти по этому пути), варианты с громкими именами выглядят так:
( Хорошее введение в 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-запросов возвращали исключения, в основном из-за того, что сайты законно ломались, а общее время до завершения приходило в течение нескольких минут, что приемлемо в Мое мнение.
PHP уже оптимизирует его - переменные присвоены с помощью копии на записи, и объекты передаются ссылкой. В PHP 4 это не делает, но никто не должен использовать PHP 4 для нового кода так или иначе.
Быстрый Google, казалось бы, предположил бы, что они изменяемы, но предпочтительная практика должна рассматривать их как неизменных.