在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 相关文章推荐
java直接调用python脚本的例子
Feb 16 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
python基础教程之Filter使用方法
Jan 17 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
python实现多层感知器MLP(基于双月数据集)
Jan 18 Python
python调试神器PySnooper的使用
Jul 03 Python
Python单元测试与测试用例简析
Nov 09 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
Feb 21 Python
Python selenium模块实现定位过程解析
Jul 09 Python
Python如何爬取51cto数据并存入MySQL
Aug 25 Python
Python文件操作及内置函数flush原理解析
Oct 13 Python
python内置进制转换函数的操作
Jun 02 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 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
探讨如何使用SimpleXML函数来加载和解析XML文档
2013/06/07 PHP
Codeigniter(CI)框架分页函数及相关知识
2014/11/03 PHP
Yii2验证器(Validator)用法分析
2016/07/23 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
Jquery中dialog属性小记
2010/09/03 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
document.write的几点使用心得
2014/05/14 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
浅析jQuery 遍历函数,javascript中的each遍历
2016/05/25 Javascript
使用jQuery5分钟快速搞定双色表格的简单实例
2016/08/08 Javascript
浅析Angular2子模块以及异步加载
2017/04/24 Javascript
vue.js2.0点击获取自己的属性和jquery方法
2018/02/23 jQuery
JavaScript分步实现一个出生日期的正则表达式
2018/03/22 Javascript
bootstrapTable+ajax加载数据 refresh更新数据
2018/08/31 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
node实现简单的增删改查接口实例代码
2019/08/22 Javascript
使用webpack将ES6转化ES5的实现方法
2019/10/13 Javascript
JavaScript算法学习之冒泡排序和选择排序
2019/11/02 Javascript
python实现自动更换ip的方法
2015/05/05 Python
玩转python爬虫之正则表达式
2016/02/17 Python
Python基于回溯法子集树模板解决全排列问题示例
2017/09/07 Python
Python学习之Django的管理界面代码示例
2018/02/10 Python
Diango + uwsgi + nginx项目部署的全过程(可外网访问)
2018/04/22 Python
解决pandas 作图无法显示中文的问题
2018/05/24 Python
tensorflow-gpu安装的常见问题及解决方案
2020/01/20 Python
python中pop()函数的语法与实例
2020/12/01 Python
Agoda中文官网:安可达(低价预订全球酒店)
2021/01/18 全球购物
自主招生自荐信指南
2014/02/04 职场文书
励志演讲稿3分钟
2014/08/21 职场文书
工伤事故赔偿协议书范文
2014/09/24 职场文书
党的群众路线整改落实情况汇报
2014/10/28 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
2016年国陪研修感言
2015/11/18 职场文书
java设计模式--七大原则详解
2021/07/21 Java/Android