在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脚本批量下载DesktopNexus壁纸的教程
May 06 Python
利用Python获取操作系统信息实例
Sep 02 Python
Python实现多并发访问网站功能示例
Jun 19 Python
Python通过matplotlib画双层饼图及环形图简单示例
Dec 15 Python
python+matplotlib实现鼠标移动三角形高亮及索引显示
Jan 15 Python
解决Pycharm中import时无法识别自己写的程序方法
May 18 Python
使用python中的in ,not in来检查元素是不是在列表中的方法
Jul 06 Python
Python清空文件并替换内容的实例
Oct 22 Python
Pytorch中的variable, tensor与numpy相互转化的方法
Oct 10 Python
Python简单实现区域生长方式
Jan 16 Python
双向RNN:bidirectional_dynamic_rnn()函数的使用详解
Jan 20 Python
PyCharm Anaconda配置PyQt5开发环境及创建项目的教程详解
Mar 24 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中Ioc(控制反转)和Di(依赖注入)
2017/05/07 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
Laravel框架生命周期与原理分析
2018/06/12 PHP
动态改变textbox的宽高的js
2006/10/26 Javascript
定义JavaScript二维数组采用定义数组的数组来实现
2012/12/09 Javascript
怎样在JavaScript里写一个swing把数据插入数据库
2012/12/10 Javascript
JS实现模仿微博发布效果实例代码
2013/12/16 Javascript
JavaScript基础教程之alert弹出提示框实例
2014/10/16 Javascript
node.js中的fs.stat方法使用说明
2014/12/16 Javascript
Backbone.js的Hello World程序实例
2015/06/19 Javascript
jQuery实现鼠标经过时高亮,同时其他同级元素变暗的效果
2016/09/18 Javascript
javascript中活灵活现的Array对象详解
2016/11/30 Javascript
使用Bootstrap Tabs选项卡Ajax加载数据实现
2016/12/23 Javascript
详解Angular2 之 结构型指令
2017/06/21 Javascript
vue中各选项及钩子函数执行顺序详解
2018/08/25 Javascript
vue实现一个炫酷的日历组件
2018/10/08 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
微信小程序 搜索框组件代码实例
2019/09/06 Javascript
vue-property-decorator用法详解
2019/12/12 Javascript
一文秒懂nodejs中的异步编程
2021/01/28 NodeJs
[05:17]DOTA2睡衣妹卖萌求签名 CJ第二天全明星影像
2013/07/28 DOTA
python中解析json格式文件的方法示例
2017/05/03 Python
Python实现的朴素贝叶斯分类器示例
2018/01/06 Python
python查看列的唯一值方法
2018/07/17 Python
Python实现SMTP邮件发送
2020/06/16 Python
纯CSS3实现3D旋转书本效果
2016/03/21 HTML / CSS
添柏岚英国官方网站:Timberland英国
2019/11/28 全球购物
如何高效率的查找一个月以内的数据
2012/04/15 面试题
电子商务专业个人的自我评价
2013/12/19 职场文书
个人安全生产承诺书
2014/05/22 职场文书
舞蹈专业求职信
2014/06/13 职场文书
计划生育证明格式范本
2014/09/12 职场文书
2014年团支部工作总结
2014/11/17 职场文书
创业计划书之书店
2019/09/10 职场文书
PHP获取学生成绩的方法
2021/11/17 PHP
通过T-SQL语句创建游标与实现数据库加解密功能
2022/03/16 SQL Server