Ищете способ решения IPv4/IPv6-адреса для данного полного доменного имени, однако в течение ограниченного времени.Неблокирующее решение хоста?
Я попробовал несколько способов с стандартной библиотекой Ruby,, но все они блокируют другие потоки так таймаут исключение не может вступить в силу:
Timeout.timeout(1) {addr = Socket.sockaddr_in 80,'google.com'}
Timeout.timeout(1) {addr = Socket.getaddrinfo 'google.com','http',nil,:STREAM}
Timeout.timeout(1) {addr = Socket.gethostbyname 'google.com'}
Когда ответ DNS медленно или кратковременно недоступен, все выше попытки не прекращаются раньше, чем через 60 секунд вместо заданной 1 секунды.
Я знаю adns но это не доступно, и обычно работают на жидком требуется дополнительный пакет для установки.
Есть ли другое решение?
Я боюсь, что, к сожалению, не будет работать, как выше функции блокировать другие темы, пока не закончено, так что это не возможно, чтобы периодически проверять его состояние. Пробовал с помощью CRuby и сокета «socket.gethostbyname» CPython. Это связано с тем, что GIL предотвращает несколько потоков во время вызова внешней библиотеки C. –
@DavidUnric Я обновил ответ с некоторыми подробностями и примером многопроцессорности, как добиться того, что вы пытаетесь сделать. –
Спасибо. Ваш пример работает, но вместо нового потока разворачивается новый отдельный процесс. Это необходимо или будет работать в потоке? Прошу прощения за то, что мой основной язык - Ruby и не уверен, как правильно тестировать Python. –