2

我目前正在修改我前段时间制作的一个简单的监控脚本,基本上是:

建立一个字典列表,其中包含

  • 网站网址
  • 响应时间(默认设置为无)
  • 它发回的数据(默认设置为无)

查询 (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 文档中的“设计模式 - 调度模式”页面。

4

1 回答 1

1

你可以迭代,GreenPile但你需要从你的返回一些东西,fetch这样你就不仅仅是响应了。我修改了示例,因此fetch返回一个元组,即 url 和响应正文。

urls变量现在是 urls(string) 到数据(无或字符串)的字典。迭代 a GreenPilecontinue 直到没有更多任务。迭代应该在调用的同一线程中完成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))
于 2013-12-31T03:47:57.987 回答