在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 nohup linux 后台运行输出的问题
May 11 Python
使用python将大量数据导出到Excel中的小技巧分享
Jun 14 Python
Selenium(Python web测试工具)基本用法详解
Aug 10 Python
django项目搭建与Session使用详解
Oct 10 Python
Python寻找两个有序数组的中位数实例详解
Dec 05 Python
python3实现指定目录下文件sha256及文件大小统计
Feb 25 Python
在PyCharm中控制台输出日志分层级分颜色显示的方法
Jul 11 Python
Django框架中间件定义与使用方法案例分析
Nov 28 Python
Python的对象传递与Copy函数使用详解
Dec 26 Python
Python面向对象编程基础实例分析
Jan 17 Python
如何基于Python实现数字类型转换
Feb 07 Python
如何利用Python写个坦克大战
Nov 18 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自定义函数之递归删除文件及目录
2010/08/08 PHP
基于php缓存的详解
2013/05/15 PHP
PHP下载生成的csv文件及问题总结
2015/08/06 PHP
php简单创建zip压缩文件的方法
2016/04/30 PHP
PHP+MariaDB数据库操作基本技巧备忘总结
2018/05/21 PHP
PHP+fiddler抓包采集微信文章阅读数点赞数的思路详解
2019/12/20 PHP
JS合并数组的几种方法及优劣比较
2014/09/19 Javascript
JSONP之我见
2015/03/24 Javascript
javascript实现简单的贪吃蛇游戏
2015/03/31 Javascript
js带点自动图片轮播幻灯片特效代码分享
2015/09/07 Javascript
javascript禁止超链接跳转的方法
2016/02/02 Javascript
原生js实现百叶窗效果及原理介绍
2016/04/12 Javascript
bootstrap table实现双击可编辑、添加、删除行功能
2017/09/27 Javascript
详解微信小程序调起键盘性能优化
2018/07/24 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
[01:11:27]2018DOTA2亚洲邀请赛小组赛 A组加赛 Newbee vs Optic
2018/04/03 DOTA
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
利用Python开发实现简单的记事本
2016/11/15 Python
python中Pycharm 输出中文或打印中文乱码现象的解决办法
2017/06/16 Python
Python 余弦相似度与皮尔逊相关系数 计算实例
2019/12/23 Python
Pycharm小白级简单使用教程
2020/01/08 Python
Python使用turtle库绘制小猪佩奇(实例代码)
2020/01/16 Python
如何设定的weblogic的热启动模式(开发模式)与产品发布模式
2012/09/08 面试题
xml有哪些解析技术?区别是什么
2016/04/26 面试题
大学生涯自我鉴定
2014/01/16 职场文书
《傅雷家书》教学反思
2014/04/20 职场文书
离婚协议书范文2014(夫妻感情破裂)
2014/12/14 职场文书
六年级学生期末评语
2014/12/26 职场文书
汇报材料怎么写
2014/12/30 职场文书
六一文艺汇演主持词
2015/06/30 职场文书
2016领导干部廉洁自律心得体会
2016/01/13 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
MySQL 如何分析查询性能
2021/05/12 MySQL
「SHOW BY ROCK!!」“雫シークレットマインド”组合单曲MV公开
2022/03/21 日漫
Promise静态四兄弟实现示例详解
2022/07/07 Javascript