У меня есть один миллион 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-адрес и создаю гринлет без блокировки.
спасибо