(编辑:jimmy 日期: 2025/11/3 浏览:2)
我经常需要用Python与solr进行异步请求工作。这里有段代码阻塞在Solr http请求上, 直到第一个完成才会执行第二个请求,代码如下:
import requests
#Search 1
solrResp = requests.get('http://mysolr.com/solr/statedecoded/search"_blank" href="http://www.oschina.net/p/gevent">gevent库能给我们带来些帮助。gevent底层用的是libevent库,构建于原生异步调用(select, poll等原始异步调用),libevent很好的协调很多低层的异步功能。
使用gevent很简单,让人纠结的一点就是thegevent.monkey.patch_all(), 为更好的与gevent的异步协作,它修补了很多标准库。听起来很恐怖,但是我还没有在使用这个补丁实现时遇到 问题。
事不宜迟,下面就是你如果用gevents来并行Solr请求:
import requests
from gevent import monkey
import gevent
monkey.patch_all()
class Searcher(object):
""" Simple wrapper for doing a search and collecting the
results """
def __init__(self, searchUrl):
self.searchUrl = searchUrl
def search(self):
solrResp = requests.get(self.searchUrl)
self.docs = solrResp.json()['response']['docs']
def searchMultiple(urls):
""" Use gevent to execute the passed in urls;
dump the results"""
searchers = [Searcher(url) for url in urls]
# Gather a handle for each task
handles = []
for searcher in searchers:
handles.append(gevent.spawn(searcher.search))
# Block until all work is done
gevent.joinall(handles)
# Dump the results
for searcher in searchers:
print "Search Results for %s" % searcher.searchUrl
for doc in searcher.docs:
print doc['catch_line']
searchUrls = ['http://mysolr.com/solr/statedecoded/search"htmlcode">
# Gather a handle for each task
handles = []
for searcher in searchers:
handles.append(gevent.spawn(searcher.search))
# Block until all work is done
gevent.joinall(handles)
我们让gevent产生searcher.search, 我们可以对产生的任务进行操作,然后我们可以随意的等着所有产生的任务完成,最后导出结果。
差不多就这样子.如果你有任何想法请给我们留言。让我们知道我们如何能为你的Solr搜索应用提供帮助。