在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 相关文章推荐
编写自定义的Django模板加载器的简单示例
Jul 21 Python
Python错误提示:[Errno 24] Too many open files的分析与解决
Feb 16 Python
python学习笔记之列表(list)与元组(tuple)详解
Nov 23 Python
Python 快速实现CLI 应用程序的脚手架
Dec 05 Python
pyqt5 删除layout中的所有widget方法
Jun 25 Python
python多任务之协程的使用详解
Aug 26 Python
Python自动化完成tb喵币任务的操作方法
Oct 30 Python
pytorch-神经网络拟合曲线实例
Jan 15 Python
wxPython修改文本框颜色过程解析
Feb 14 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
Apr 22 Python
Python3内置函数chr和ord实现进制转换
Jun 05 Python
python如何操作mysql
Aug 17 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之Smarty模板使用方法示例详解
2014/07/08 PHP
php生成QRcode实例
2014/09/22 PHP
PHP判断FORM表单或URL参数来的数据是否为整数的方法
2016/03/25 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
2017/03/15 PHP
php和html的区别点详细总结
2019/09/24 PHP
layui数据表格自定义每页条数limit设置
2019/10/26 PHP
Yii框架 session 数据库存储操作方法示例
2019/11/18 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
用Javascript做flash做的事..才完成的一个类.Auntion Action var 0.1
2007/02/23 Javascript
推荐10个超棒的jQuery工具提示插件
2011/10/11 Javascript
JavaScript中的property和attribute介绍
2011/12/26 Javascript
HTML页面滚动时获取离页面顶部的距离2种实现方法
2013/09/05 Javascript
NodeJS学习笔记之FS文件模块
2015/01/13 NodeJs
js实现从中间开始往上下展开网页窗口的方法
2015/03/02 Javascript
javascript常见数据验证插件大全
2015/08/03 Javascript
非常棒的jQuery图片轮播效果
2016/04/17 Javascript
浅谈JS之iframe中的窗口
2016/09/13 Javascript
JS遍历ul下的li点击弹出li的索引的实现方法
2016/09/19 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
vue深入解析之render function code详解
2017/07/18 Javascript
vue-music关于Player播放器组件详解
2017/11/28 Javascript
JavaScript折半查找(二分查找)算法原理与实现方法示例
2018/08/06 Javascript
JS实现返回上一页并刷新页面的方法分析
2019/07/16 Javascript
vue项目打包为APP,静态资源正常显示,但API请求不到数据的操作
2020/09/12 Javascript
举例讲解Python的Tornado框架实现数据可视化的教程
2015/05/02 Python
Python单链表简单实现代码
2016/04/27 Python
python微信跳一跳系列之色块轮廓定位棋盘
2018/02/26 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
Django使用消息提示简单的弹出个对话框实例
2019/11/15 Python
Html5移动端弹幕动画实现示例代码
2018/08/27 HTML / CSS
图片上传插件ImgUploadJS:用HTML5 File API 实现截图粘贴上传、拖拽上传
2016/01/20 HTML / CSS
青年文明号服务承诺
2014/03/31 职场文书
如何写好竞聘报告
2019/04/03 职场文书
调研报告的主要写法
2019/04/18 职场文书
vue实现可以快进后退的跑马灯组件
2022/04/08 Vue.js
Python实现Matplotlib,Seaborn动态数据图
2022/05/06 Python