在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实现从字典中删除元素的方法
May 04 Python
Python实现约瑟夫环问题的方法
May 03 Python
python运行其他程序的实现方法
Jul 14 Python
Python 模拟员工信息数据库操作的实例
Oct 23 Python
Python中的上下文管理器和with语句的使用
Apr 17 Python
Php多进程实现代码
May 07 Python
Python利用requests模块下载图片实例代码
Aug 12 Python
python GUI库图形界面开发之PyQt5多行文本框控件QTextEdit详细使用方法实例
Feb 28 Python
python实现简单的购物程序代码实例
Mar 03 Python
Python使用Excel将数据写入多个sheet
May 16 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
PyCharm最新激活码(2020/10/27全网最新)
Oct 27 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 strcmp使用说明
2010/04/22 PHP
php摘要生成函数(无乱码)
2012/02/04 PHP
深入PHP获取随机数字和字母的方法详解
2013/06/06 PHP
php下载文件,添加响应头的简单实例
2016/09/22 PHP
Laravel程序架构设计思路之使用动作类
2018/06/07 PHP
JQuery index()方法使用代码
2010/06/02 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
js中top/parent/frame概述及案例应用
2013/02/06 Javascript
jQuery获取Radio,CheckBox选择的Value值(示例代码)
2013/12/12 Javascript
jquery查找父元素、子元素(个人经验总结)
2014/04/09 Javascript
简介JavaScript中的getSeconds()方法的使用
2015/06/10 Javascript
谈谈我对JavaScript原型和闭包系列理解(随手笔记8)
2015/12/24 Javascript
JS留言功能的简单实现案例(推荐)
2016/06/23 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
2016/12/11 Javascript
vue.js系列中的vue-fontawesome使用
2018/02/10 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
详解Python字符串对象的实现
2015/12/24 Python
Python学生成绩管理系统简洁版
2020/04/05 Python
Selenium 模拟浏览器动态加载页面的实现方法
2018/05/16 Python
Python学习笔记之Django创建第一个数据库模型的方法
2019/08/07 Python
Python接口自动化判断元素原理解析
2020/02/24 Python
Python-jenkins模块获取jobs的执行状态操作
2020/05/12 Python
如何一键升级Python所有包
2020/11/05 Python
详解CSS3:overflow属性
2020/11/17 HTML / CSS
HTML5 textarea高度自适应的两种方案
2020/04/08 HTML / CSS
函授本科毕业生自我鉴定
2013/10/16 职场文书
自荐信格式简述
2014/01/25 职场文书
《商鞅南门立木》教学反思
2014/02/16 职场文书
联谊会主持词
2014/03/26 职场文书
银行行长竞聘演讲稿
2014/04/23 职场文书
毕业论文评语大全
2014/04/29 职场文书
甜品店创业计划书
2014/09/21 职场文书
广播体操比赛主持词
2015/06/29 职场文书
装修公司管理制度
2015/08/05 职场文书
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers