在Python的gevent框架下执行异步的Solr查询的教程


Posted in Python onApril 16, 2015

 我经常需要用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 相关文章推荐
Python os模块学习笔记
Jun 21 Python
Python简单删除列表中相同元素的方法示例
Jun 12 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
Mar 19 Python
python爬取各类文档方法归类汇总
Mar 22 Python
Python3.6简单反射操作示例
Jun 14 Python
python使用插值法画出平滑曲线
Dec 15 Python
Python3.4学习笔记之列表、数组操作示例
Mar 01 Python
详解python编译器和解释器的区别
Jun 24 Python
如何使用python3获取当前路径及os.path.dirname的使用
Dec 13 Python
Jupyter加载文件的实现方法
Apr 14 Python
Django创建一个后台的基本步骤记录
Oct 02 Python
PyTorch中的torch.cat简单介绍
Mar 17 Python
使用Python的Treq on Twisted来进行HTTP压力测试
Apr 16 #Python
Python3中多线程编程的队列运作示例
Apr 16 #Python
使用Python脚本操作MongoDB的教程
Apr 16 #Python
使用Python中的greenlet包实现并发编程的入门教程
Apr 16 #Python
利用Python的Twisted框架实现webshell密码扫描器的教程
Apr 16 #Python
使用Python的Twisted框架实现一个简单的服务器
Apr 16 #Python
使用Python的Twisted框架编写简单的网络客户端
Apr 16 #Python
You might like
关于PHP中操作MySQL数据库的一些要注意的问题
2006/10/09 PHP
PHP实现获取域名的方法小结
2014/11/05 PHP
PHP中让curl支持sock5的代码实例
2015/01/21 PHP
PHP判断是否微信访问的方法示例
2019/03/27 PHP
ext 列表页面关于多行查询的办法
2010/03/25 Javascript
基于jquery的不规则矩形的排列实现代码
2012/04/16 Javascript
javascript里模拟sleep(两种实现方式)
2013/01/25 Javascript
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
Javascript call和apply区别及使用方法
2013/11/14 Javascript
JS实现可缩放、拖动、关闭和最小化的浮动窗口完整实例
2015/03/04 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
使用json-server简单完成CRUD模拟后台数据的方法
2018/07/12 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
微信小程序多列表渲染数据开关互不影响的实现
2020/06/05 Javascript
[01:32]TI珍贵瞬间系列(一)
2020/08/26 DOTA
[54:19]完美世界DOTA2联赛PWL S2 Magma vs PXG 第二场 11.28
2020/12/01 DOTA
Python实现Sqlite将字段当做索引进行查询的方法
2016/07/21 Python
Python编程实现及时获取新邮件的方法示例
2017/08/10 Python
Python模糊查询本地文件夹去除文件后缀的实例(7行代码)
2017/11/09 Python
Python+request+unittest实现接口测试框架集成实例
2018/03/16 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
Django REST Framework之频率限制的使用
2019/09/29 Python
Python散点图与折线图绘制过程解析
2019/11/30 Python
Python属性和内建属性实例解析
2020/01/14 Python
Python实现哲学家就餐问题实例代码
2020/11/09 Python
jQuery treeview树形结构应用
2021/03/24 jQuery
座谈会主持词
2014/03/20 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
领导班子在批评与自我批评座谈会上的发言
2014/09/28 职场文书
群众路线领导班子整改方案
2014/10/25 职场文书
雷锋电影观后感
2015/06/10 职场文书
2016年少先队活动总结
2016/04/06 职场文书
Nginx下配置Https证书详细过程
2021/04/01 Servers
React如何创建组件
2021/06/27 Javascript
JavaWeb 入门篇(3)ServletContext 详解 具体应用
2021/07/16 Java/Android
MySQL数据库中varchar类型的数字比较大小的方法
2021/11/17 MySQL