я в настоящее время модификации простого скрипта мониторинга, который я сделал некоторое время назад, что в основном:Извлечение данных из объекта 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()
в первом списке и заполнить его вторым, но я предпочел бы сохранить список словарей.
* Я не могу размещать более трех ссылок с этой учетной записью, пожалуйста, просмотрите страницу «Образцы дизайна - Отправка шаблонов» из документации по сертификатам.