在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实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
Python reduce()函数的用法小结
Nov 15 Python
Python模块WSGI使用详解
Feb 02 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
Python神奇的内置函数locals的实例讲解
Feb 22 Python
Python 在OpenCV里实现仿射变换—坐标变换效果
Aug 30 Python
Python对Excel按列值筛选并拆分表格到多个文件的代码
Nov 05 Python
详解Django配置优化方法
Nov 18 Python
TFRecord格式存储数据与队列读取实例
Jan 21 Python
python进行OpenCV实战之画图(直线、矩形、圆形)
Aug 27 Python
python绘制趋势图的示例
Sep 17 Python
Python实现位图分割的效果
Nov 20 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
div li的多行多列 无刷新分页示例代码
2013/10/16 PHP
PHP获取当前URL路径的处理方法(适用于多条件筛选列表)
2017/02/10 PHP
php base64 编码与解码实例代码
2017/03/21 PHP
php字符串函数 str类常见用法示例
2020/05/15 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
Prototype使用指南之selector.js
2007/01/10 Javascript
JQuery获取样式中的background-color颜色值的问题
2013/08/20 Javascript
jquery的选择器的使用技巧之如何选择input框
2013/09/22 Javascript
21个值得收藏的Javascript技巧
2014/02/04 Javascript
avalon js实现仿google plus图片多张拖动排序附源码下载
2015/09/24 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
JS动态添加选项案例分析
2016/10/17 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
2018/01/20 Javascript
vue2.0+vuex+localStorage代办事项应用实现详解
2018/05/31 Javascript
在vue2.0中引用element-ui组件库的方法
2018/06/21 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
微信小程序激励式视频广告组件使用详解
2019/12/06 Javascript
javascript递归函数定义和用法示例分析
2020/07/22 Javascript
vue-cli中实现响应式布局的方法
2021/03/02 Vue.js
[48:24]完美世界DOTA2联赛PWL S3 Forest vs INK ICE 第一场 12.09
2020/12/12 DOTA
Python编程中的反模式实例分析
2014/12/08 Python
django使用xlwt导出excel文件实例代码
2018/02/06 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
Django 实现外键去除自动添加的后缀‘_id’
2019/11/15 Python
python中selenium库的基本使用详解
2020/07/31 Python
基于Django集成CAS实现流程详解
2020/11/28 Python
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
澳大利亚天然护肤品、化妆品和健康产品一站式商店:Nourished Life
2018/12/02 全球购物
《美丽的田园》教学反思
2014/03/01 职场文书
青年文明号口号
2014/06/17 职场文书
教师党员个人自我剖析材料
2014/09/29 职场文书
2016年寒假社会实践活动总结
2015/03/27 职场文书
师德师风培训感言
2015/08/03 职场文书
业余无线电通联Q语
2022/02/18 无线电
idea下配置tomcat避坑详解
2022/04/12 Servers