2013-06-17 4 views
1

я в настоящее время модификации простого скрипта мониторинга, который я сделал некоторое время назад, что в основном:Извлечение данных из объекта Eventlet GreenPile, возможно итератор, связанные с

Построить список словарей, содержащих, среди прочего

  • сайт URL
  • время, которое потребовалось, чтобы ответить (установлен как None по умолчанию)
  • данные посланное назад (установленый по умолчанию None)

Запросить (GET) каждый URL из списка и заполнить поля «время» и «данные» соответствующими данными.

Сохраните результаты в базе данных.

Сценарий работал нормально, но поскольку список URLS для мониторинга увеличился, время, необходимое для завершения всех запросов, стало слишком длинным для меня.

Мое решение состоит в том, чтобы изменить сценарий для одновременного извлечения URL-адресов. Для этого я решил использовать eventlet, так как this example из документации делает почти то, что я хочу.

Уловка заключается в том, что, поскольку в моем списке URL-адресов имеются словари, я не могу использовать pool.imap() для перебора в моем списке. (Насколько я знаю)

В документации к Eventlet имеется еще один аналогичный пример *, который использует объект GreenPile для создания заданий, похоже, я могу использовать это для запуска функции выбора URL-адреса, но я не могу показаться способным для получения результата этого потока.

Вот мой тестовый код:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import eventlet 
from eventlet.green import urllib2 


urls = [{'url': 'http://www.google.com/intl/en_ALL/images/logo.gif', 'data': None}, 
{'url': 'http://www.google.com', 'data': None}] 


def fetch(url): 
    return urllib2.urlopen(url).read() 


pool = eventlet.GreenPool() 
pile = eventlet.GreenPile(pool) 


for url in urls: 
    pile.spawn(fetch, url['url']) #can I get the return of the function here? 

#or 
for url in urls: 
    url['data'] = ??? #How do I get my data back? 

#Eventlet's documentation way 
data = "\n".join(pile) 

Насколько я понимаю pile является итерацией, так что я могу перебирать его, но я не могу получить доступ к его содержимому с помощью индекса, это правильно?

Итак, как (возможно?) Могу ли я непосредственно заполнить свой список urls? Другим решением может быть построение одного «плоского» списка URL-адресов, другого списка, содержащего URL-адрес, соответствующее время и данные, и использовать pool.imap() в первом списке и заполнить его вторым, но я предпочел бы сохранить список словарей.

* Я не могу размещать более трех ссылок с этой учетной записью, пожалуйста, просмотрите страницу «Образцы дизайна - Отправка шаблонов» из документации по сертификатам.

ответ

0

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

Переменная urls теперь является типом URL-адресов (строк) для данных (None или string). Итерация по GreenPile продолжается до тех пор, пока не будет больше задач. Итерацию следует выполнять в той же резьбе, которая вызывает spawn

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import eventlet 
from eventlet.green import urllib2 


#Change to map urls to the data found at them 
urls = {'http://www.google.com/intl/en_ALL/images/logo.gif': None, 
'http://www.google.com' :None} 


def fetch(url): 
    #return the url and the response 
    return (url, urllib2.urlopen(url).read()) 


pool = eventlet.GreenPool() 
pile = eventlet.GreenPile(pool) 


for url in urls.iterkeys(): 
    pile.spawn(fetch, url) #can I get the return of the function here? - No 

for url,response in pile: 
    #stick it back into the dict 
    urls[url] = response 

for k,v in urls.iteritems(): 
    print '%s - %d bytes' % (k,len(v)) 

 Смежные вопросы

  • Нет связанных вопросов^_^