在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提取html文件中的特定数据的实现代码
Mar 24 Python
python中列表元素连接方法join用法实例
Apr 07 Python
Python中用PIL库批量给图片加上序号的教程
May 06 Python
python中关于for循环的碎碎念
Jun 30 Python
python中requests库session对象的妙用详解
Oct 30 Python
Scrapy抓取京东商品、豆瓣电影及代码分享
Nov 23 Python
Python 使用with上下文实现计时功能
Mar 09 Python
Django之提交表单与前后端交互的方法
Jul 19 Python
pytorch 获取层权重,对特定层注入hook, 提取中间层输出的方法
Aug 17 Python
python颜色随机生成器的实例代码
Jan 10 Python
Pyqt助手安装PyQt5帮助文档过程图解
Nov 20 Python
python 爬虫网页登陆的简单实现
Nov 30 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
将RTF格式的文件转成HTML并在网页中显示的代码
2006/10/09 PHP
PHP类的静态(static)方法和静态(static)变量使用介绍
2012/02/19 PHP
php获取操作系统语言代码
2013/11/04 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
详解WordPress中添加和执行动作的函数使用方法
2015/12/29 PHP
php使用curl实现简单模拟提交表单功能
2017/05/15 PHP
PHP实现倒计时功能
2020/11/16 PHP
Div自动滚动到末尾的代码
2008/10/26 Javascript
让Firefox支持event对象实现代码
2009/11/07 Javascript
30个精美的jQuery幻灯片效果插件和教程
2011/08/23 Javascript
关于js数组去重的问题小结
2014/01/24 Javascript
可编辑下拉框的2种实现方式
2014/06/13 Javascript
js图片卷帘门导航菜单特效代码分享
2015/09/10 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
2016/06/20 Javascript
JS实现控制文本框的内容
2016/07/10 Javascript
jQuery实现发送验证码并60秒倒计时功能
2016/11/25 Javascript
JS常见算法详解
2017/02/28 Javascript
bootstrap table单元格新增行并编辑
2017/05/19 Javascript
NodeJS收发GET和POST请求的示例代码
2017/08/25 NodeJs
vue-cli中的webpack配置详解
2017/09/25 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
vue技术分享之你可能不知道的7个秘密
2018/04/09 Javascript
JavaScript显式数据类型转换详解
2019/03/18 Javascript
基于JS实现web端录音与播放功能
2019/04/17 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
Python编程实现微信企业号文本消息推送功能示例
2017/08/21 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
Python list运算操作代码实例解析
2020/01/20 Python
python识别验证码的思路及解决方案
2020/09/13 Python
C++面试题目
2013/06/25 面试题
教师校本培训方案
2014/02/26 职场文书
主持人演讲稿
2014/05/13 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
2019年消防宣传标语集锦
2019/11/21 职场文书
Spring Boot 使用 Spring-Retry 进行重试框架
2022/04/24 Java/Android
腾讯云服务器部署前后分离项目之前端部署
2022/06/28 Servers