在Python的gevent框架下执行异步的Solr查询的教程
2015-04-16 11:24
986 查看
我经常需要用Python与solr进行异步请求工作。这里有段代码阻塞在Solr http请求上, 直到第一个完成才会执行第二个请求,代码如下:
import requests #Search 1 solrResp = requests.get('http://mysolr.com/solr/statedecoded/search?q=law') for doc in solrResp.json()['response']['docs']: print doc['catch_line'] #Search 2 solrResp = requests.get('http://mysolr.com/solr/statedecoded/search?q=shoplifting') for doc in solrResp.json()['response']['docs']: print doc['catch_line']
(我们用Requests库进行http请求)
通过脚本把文档索引到Solr, 进而可以并行工作是很好的。我需要扩展我的工作,因此索引瓶颈是Solr,而不是网络请求。
不幸的是,当进行异步编程时python不像Javascript或Go那样方便。但是,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?q=law', 'http://mysolr.com/solr/statedecoded/search?q=shoplifting']
searchMultiple(searchUrls)
代码增加了,而且不如相同功能的Javascript代码简洁,但是它能完成相应的工作,代码的精髓是下面几行:
# 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搜索应用提供帮助。
您可能感兴趣的文章:
相关文章推荐
- python通过thrift连接hive,异步执行查询
- 使用Python的web.py框架实现类似Django的ORM查询的教程
- Python的gevent框架的入门教程
- 使用Python的web.py框架实现类似Django的ORM查询的教程
- Python的gevent框架的入门教程
- Python 中的串行执行 并发执行 同步异步
- 使用url_helper简化Python中Django框架的url配置教程
- Solr执行查询操作
- python-Django框架,分页以及数据库执行情况详细探究
- 举例讲解Python的Tornado框架实现数据可视化的教程
- 在Python的web框架中配置app的教程
- python数据存储系列教程——python操作sqlite数据库:连接、增删查改、指令执行
- Python操作Mysql实例代码教程(查询手册)
- [Python]网络爬虫(12):爬虫框架Scrapy的第一个爬虫示例入门教程
- Python Web框架 tornado 异步原理
- Python的Flask框架标配模板引擎Jinja2的使用教程
- 用Python的Django框架完成视频处理任务的教程
- Python操作Mysql实例代码教程在线版(查询手册)
- Python的Flask框架标配模板引擎Jinja2的使用教程
- Python的Flask框架中的Jinja2模板引擎学习教程