在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 文件和输入输出小结
Oct 09 Python
python实现zencart产品数据导入到magento(python导入数据)
Apr 03 Python
python字典多条件排序方法实例
Jun 30 Python
Python 搭建Web站点之Web服务器与Web框架
Nov 06 Python
django页面跳转问题及注意事项
Jul 18 Python
python自动化实现登录获取图片验证码功能
Nov 20 Python
Python中base64与xml取值结合问题
Dec 22 Python
python字典key不能是可以是啥类型
Aug 04 Python
Python如何爬取b站热门视频并导入Excel
Aug 10 Python
Python数据可视化常用4大绘图库原理详解
Oct 23 Python
python实现学生信息管理系统源码
Feb 22 Python
Python中基础数据类型 set集合知识点总结
Aug 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
香妃
2021/03/03 冲泡冲煮
php方法调用模式与函数调用模式简例
2011/09/20 PHP
一个PHP针对数字的加密解密类
2014/03/20 PHP
优化WordPress中文章与评论的时间显示
2016/01/12 PHP
javascript下function声明一些小结
2007/12/28 Javascript
JS小框架 fly javascript framework
2009/11/26 Javascript
Jquery ajax不能解析json对象,报Invalid JSON错误的原因和解决方法
2010/03/27 Javascript
一个简单的jQuery插件制作 学习过程及实例
2010/04/25 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
bootstrap table 服务器端分页例子分享
2015/02/10 Javascript
jQuery鼠标事件汇总
2015/08/30 Javascript
深入剖析JavaScript:Object类型
2016/05/10 Javascript
解读Bootstrap v4 sass设计
2016/05/29 Javascript
工作中比较实用的JavaScript验证和数据处理的干货(经典)
2016/08/03 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
基于vue.js快速搭建图书管理平台
2017/10/29 Javascript
vue-cli 组件的导入与使用教程详解
2018/04/11 Javascript
vue 做移动端微信公众号采坑经验记录
2018/04/26 Javascript
[19:24]DOTA2客户端使用指南 一分钟快速设置轻松超神
2013/09/24 DOTA
浅谈python 里面的单下划线与双下划线的区别
2017/12/01 Python
在ubuntu16.04中将python3设置为默认的命令写法
2018/10/31 Python
numpy求平均值的维度设定的例子
2019/08/24 Python
PyCharm如何导入python项目的方法
2020/02/06 Python
python接入支付宝的实例操作
2020/07/20 Python
深入了解canvas在移动端绘制模糊的问题解决
2019/04/30 HTML / CSS
趣天网日本站:Qoo10 JP
2019/09/18 全球购物
俄罗斯在线大型超市:ТутПросто
2021/01/08 全球购物
年终自我鉴定
2013/10/09 职场文书
给医务人员表扬信
2014/01/12 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
保证金退回承诺函格式
2015/01/21 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
七年级之开学家长寄语35句
2019/09/05 职场文书
导游词之上海豫园
2019/10/24 职场文书
Python使用BeautifulSoup4修改网页内容
2022/05/20 Python
前端使用svg图片改色实现示例
2022/07/23 HTML / CSS