Helpers - компьютеры, интернет, программирование

как проверить URL с помощью gevent

У меня есть один миллион URL-адресов для проверки. некоторые из них недоступны из моей страны, а некоторые недействительны, я хочу проверить все URL-адреса. Я использую python для этого и использую gevent для ускорения, но я новичок в gevent, некоторые, кажется, не работают. мой код следующий:

import gevent
import gevent.monkey
import urllib2
from gevent.pool import Pool
from gevent import Timeout
gevent.monkey.patch_all()
p = Pool(10)

seconds = 10

#timeout = Timeout(seconds)
#timeout.start()
#timer = Timeout(3).start()

def down(url):
    urllib2.urlopen(url)


def wait():
    while True:
        gevent.sleep(0)
        print 'hi'
        with Timeout(5,False):
            p.spawn(down,'http://www.twitter.com')
        print '---------------------------------'
wait()

твиттер недоступен из моей страны, вывод:

hi
---------------------------------
hi
---------------------------------
hi

и он не сообщил тайм-аут через 5 секунд, что не так с моим кодом?

и интересно узнать как добавить новую задачу в gevent при запуске.

Я хочу проверить все свои URL-адреса в рассылке, поэтому я читаю URL-адрес из своей базы данных и отправляю URL-адрес в очередь сообщений, многие получатели получают сообщение из сообщения, а затем проверяют URL-адрес.

мое сообщение RabbitMQ.

Я просто знаю, что если у меня есть 10 URL-адресов, я могу использовать gevent, например:

for x in xrange(10)
    tasks.append(gevent.spawn(validate,url))
gevent.joinall(tasks)

но в моей ситуации я просто читаю одно сообщение, а затем создаю гринлет, и если URL-адрес недоступен, он блокирует сообщение до тех пор, пока гринлет не будет завершен.

так как я могу сделать асинхронный способ проверки моих URL-адресов? например, я всегда читаю URL-адрес и создаю гринлет без блокировки.

спасибо

18.03.2013

Ответы:


1

Вам нужно обернуть код ввода/вывода/ожидания с помощью with Timeout(). Прямо сейчас вы оборачиваете вызов gevent.spawn()/pool.spawn(), что неправильно. В этом случае код ввода-вывода, для которого вы хотите установить тайм-аут, — urllib2.urlopen(url).

Код такого рода обычно выглядит примерно так:

validated = []
urls = ["http://a.com", "http://b.com"]

def down(url):
    with Timeout(5, False):
        urllib2.urlopen(url)
        validated.append(url)

pool = gevent.Pool(10)
for url in urls:
    pool.spawn(down, url)
pool.join() #you didn't call pool.join() in the original code because you have a wait loop already, which is okay
print "Valid URLs are: %s" % ", ".join(validated)

Вы можете сохранить свой бесконечный цикл while True и получать входящие URL-адреса из своей базы данных/очереди. Это, вероятно, то, что вы хотите. Я просто привожу пример того, что я сделал бы, чтобы проверить предварительно установленный список URL-адресов, которые я хочу проверить.

В этом случае ваша ошибка заключается в том, что вы обернули pool.spawn() файлом with Timeout(). Акт создания зеленого зеленца произойдет почти мгновенно, поэтому добавление тайм-аута ничего не даст. Вот почему вы не видите тайм-аут. Вам нужно обернуть вызов urllib2.urlopen() контекстом Timeout().

Кроме того, если вы просто проверяете тайм-ауты, это работает нормально. Вы можете проверить, вернул ли запрос HTTP-код 200, и в этом случае вы должны проверить urllib2.urlopen(url).getcode().

19.03.2013
Новые материалы

Интуитивное понимание тензоров в машинном обучении
Тензор является важной концепцией во многих научных областях, таких как математика, физика, обработка сигналов и компьютерное зрение, и это лишь некоторые из них. В математике тензор — это..

Использование машинного обучения для диагностики болезни Альцгеймера, часть 4
Маркеры семантической согласованности для ранней диагностики болезни Альцгеймера (arXiv) Автор: Давиде Колла , Маттео Дельсанто , Марко Агосто , Бенедетто Витиелло , Даниэле Паоло Радичони..

Почему объяснимость так важна прямо сейчас?
По мере того, как системы искусственного интеллекта и инструменты на основе машинного обучения распространяются в нашей повседневной жизни, как практики, так и критики все чаще заявляют о..

Анимированный математический анализ
Использование Manim для создания математических анимированных визуализаций Визуализация данных помогает понять скрытые закономерности в данных, которые невозможно визуализировать..

Создание простого слайдера изображений с помощью JavaScript
Узнайте, как создать базовый слайдер изображений с помощью HTML, CSS и JavaScript. Введение В этом уроке мы создадим удобный слайдер изображений, используя JavaScript, HTML и CSS. Ползунок..

Создание базы данных с помощью супергероя «Python»
В этом посте мы узнаем, как создать «базу данных SQLite с помощью модуля python sqlite3, создав простую функцию входа и регистрации. Готовы ли вы к этому путешествию? Если да , давайте приступим..

ИИ для чайников: руководство для начинающих по пониманию будущего технологий
Вы чувствуете, что остались позади в мире ИИ? Не волнуйтесь, вы не одиноки! Со всей этой шумихой вокруг искусственного интеллекта может быть трудно понять, с чего начать. Но не позволяйте сленгу..