在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检测lvs real server状态
Jan 22 Python
python基础教程之对象和类的实际运用
Aug 29 Python
使用django-suit为django 1.7 admin后台添加模板
Nov 18 Python
Python的函数的一些高阶特性
Apr 27 Python
详解Python3中yield生成器的用法
Aug 20 Python
Python中.py文件打包成exe可执行文件详解
Mar 22 Python
Python Flask-web表单使用详解
Nov 18 Python
Tornado 多进程实现分析详解
Jan 12 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
python开启debug模式的方法
Jun 27 Python
python 使用socket传输图片视频等文件的实现方式
Aug 07 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 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
全国FM电台频率大全 - 9 上海市
2020/03/11 无线电
php中计算时间差的几种方法
2009/12/31 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
php实现兼容2038年后Unix时间戳转换函数
2015/03/18 PHP
php使用Header函数,PHP_AUTH_PW和PHP_AUTH_USER做用户验证
2016/05/04 PHP
javascript的函数
2007/01/31 Javascript
javascript 进度条 实现代码
2009/07/30 Javascript
js 限制input只能输入数字、字母和汉字等等
2013/12/18 Javascript
jquery动态添加元素事件失效问题解决方法
2014/05/23 Javascript
使用JavaScript链式编程实现模拟Jquery函数
2014/12/21 Javascript
JavaScript设计模式之单件模式介绍
2014/12/28 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
jQuery无刷新切换主题皮肤实例讲解
2015/10/21 Javascript
jQuery计算文本框字数及限制文本框字数的方法
2016/03/01 Javascript
Bootstrap Table表格一直加载(load)不了数据的快速解决方法
2016/09/17 Javascript
JS中对数组元素进行增删改移的方法总结
2016/12/15 Javascript
three.js快速入门【推荐】
2017/01/21 Javascript
JS异步加载的三种实现方式
2017/03/16 Javascript
详解微信第三方小程序代开发
2017/06/23 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
vue.js中toast用法及使用toast弹框的实例代码
2018/08/27 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
Vue 中文本内容超出规定行数后展开收起的处理的实现方法
2019/04/28 Javascript
js中比较两个对象是否相同的方法示例
2019/09/02 Javascript
vue+elementUI 实现内容区域高度自适应的示例
2020/09/26 Javascript
Python中内建函数的简单用法说明
2016/05/05 Python
python 等差数列末项计算方式
2020/05/03 Python
仿CSDN Blog返回页面顶部功能实现原理及代码
2013/06/30 HTML / CSS
Stylenanda中文站:韩国一线网络服装品牌
2016/12/22 全球购物
性能服装:HYLETE
2018/08/14 全球购物
墨西哥购物网站:Elektra
2020/01/21 全球购物
乌克兰的第一家手表店:Deka
2020/03/05 全球购物
会话Bean的种类
2013/11/07 面试题
小学优秀教师先进事迹材料
2014/12/16 职场文书
天堂的孩子观后感
2015/06/11 职场文书
高通2023 年将发布高性能PC处理器
2022/04/29 数码科技