我目前正在修改我前段时间制作的一个简单的监控脚本,基本上是:
建立一个字典列表,其中包含
- 网站网址
- 响应时间(默认设置为无)
- 它发回的数据(默认设置为无)
查询 (GET) 列表中的每个 URL,并用相关数据填充“时间”和“数据”字段。
将结果存储在数据库中。
该脚本过去运行良好,但随着要监控的 URL 列表的增加,完成所有查询所需的时间对我来说变得太长了。
我的解决方案是修改脚本以并发方式获取 URL。为此,我选择使用eventlet,因为文档中的这个示例几乎完全符合我的要求。
问题是,由于我的 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、resp 时间和数据pool.imap()
的列表,并在第一个列表中使用并用它填充第二个列表,但我宁愿保留我的字典列表。
*我不能用这个帐户发布超过 3 个链接,请参阅 eventlet 文档中的“设计模式 - 调度模式”页面。