在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中 logging的使用详解
Oct 25 Python
Python实现可设置持续运行时间、线程数及时间间隔的多线程异步post请求功能
Jan 11 Python
python多线程之事件Event的使用详解
Apr 27 Python
Python系统监控模块psutil功能与经典用法分析
May 24 Python
Django文件存储 默认存储系统解析
Aug 02 Python
PyQtGraph在pyqt中的应用及安装过程
Aug 04 Python
使用Python爬取弹出窗口信息的实例
Mar 14 Python
Python读取yaml文件的详细教程
Jul 21 Python
详解python模块pychartdir安装及导入问题
Oct 22 Python
Python爬虫scrapy框架Cookie池(微博Cookie池)的使用
Jan 13 Python
Python如何导出导入所有依赖包详解
Jun 08 Python
Python实战之OpenCV实现猫脸检测
Jun 26 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/12/29 PHP
php连接mssql数据库的几种方法
2013/02/21 PHP
神盾加密解密教程(一)PHP变量可用字符
2014/05/28 PHP
strpos() 函数判断字符串中是否包含某字符串的方法
2019/01/16 PHP
window.onload 加载完毕的问题及解决方案(下)
2009/07/09 Javascript
JS检测图片大小的实例
2013/08/21 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
JavaScript实现form表单的多文件上传
2020/03/27 Javascript
基于JS脚本语言的基础语法详解
2017/07/22 Javascript
JS中正则表达式要注意lastIndex属性
2017/08/08 Javascript
angularjs 缓存的使用详解
2018/03/19 Javascript
BootStrap table实现表格行拖拽效果
2018/12/01 Javascript
vue spa应用中的路由缓存问题与解决方案
2019/05/31 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
[04:13]2014DOTA2国际邀请赛 专访DC目前形势不容乐观
2014/07/12 DOTA
python3.3使用tkinter开发猜数字游戏示例
2014/03/14 Python
Python的Flask框架中使用Flask-Migrate扩展迁移数据库的教程
2016/06/14 Python
Python 自动刷博客浏览量实例代码
2017/06/14 Python
opencv与numpy的图像基本操作
2019/03/08 Python
在Django中实现添加user到group并查看
2019/11/18 Python
详解Django3中直接添加Websockets方式
2020/02/12 Python
django实现更改数据库某个字段以及字段段内数据
2020/03/31 Python
利用html5 file api读取本地文件示例(如图片、PDF等)
2018/03/07 HTML / CSS
Boden美国官网:英伦原创时装品牌
2017/07/03 全球购物
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
入党积极分子思想汇报
2014/01/02 职场文书
工程管理英文求职信
2014/03/18 职场文书
中学生寄语大全
2014/04/03 职场文书
2014新生大学四年计划书
2014/09/21 职场文书
2014大学生批评与自我批评思想汇报
2014/09/21 职场文书
弘扬焦裕禄精神践行三严三实心得体会
2014/10/13 职场文书
2015年社区关工委工作总结
2015/04/03 职场文书
单位实习介绍信
2015/05/05 职场文书
重阳节主题班会
2015/08/17 职场文书
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技