在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 3利用BeautifulSoup抓取div标签的方法示例
May 28 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
wxPython实现窗口用图片做背景
Apr 25 Python
Python socket实现的简单通信功能示例
Aug 21 Python
pygame游戏之旅 添加游戏暂停功能
Nov 21 Python
pandas通过loc生成新的列方法
Nov 28 Python
解决python打不开文件(文件不存在)的问题
Feb 18 Python
python如何使用jt400.jar包代码实例
Dec 20 Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 Python
Python 下载Bing壁纸的示例
Sep 29 Python
pandas数值排序的实现实例
Jul 25 Python
关于python3 opencv 图像二值化的问题(cv2.adaptiveThreshold函数)
Apr 04 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开发大型项目的一点经验
2006/10/09 PHP
php笔记之:初探PHPcms模块开发介绍
2013/04/26 PHP
深入PHP empty(),isset(),is_null()的实例测试详解
2013/06/06 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
详解PHP实现定时任务的五种方法
2016/07/25 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
2019/05/09 PHP
Javascript YUI 读码日记之 YAHOO.util.Dom - Part.2 0
2008/03/22 Javascript
风吟的小型JavaScirpt库 (FY.JS).
2010/03/09 Javascript
修改jQuery Validation里默认的验证方法
2012/02/14 Javascript
jquery插件lazyload.js延迟加载图片的使用方法
2014/02/19 Javascript
js的touch事件的实际引用
2014/10/13 Javascript
浅谈javascript中return语句
2015/07/15 Javascript
window.open打开窗口被拦截的快速解决方法
2016/08/04 Javascript
基于JSON数据格式详解
2017/08/31 Javascript
2019最新21个MySQL高频面试题介绍
2020/02/06 Javascript
[00:36]DOTA2上海特级锦标赛 LGD战队宣传片
2016/03/04 DOTA
python字符串连接的N种方式总结
2014/09/17 Python
Python利用公共键如何对字典列表进行排序详解
2018/05/19 Python
Python字典添加,删除,查询等相关操作方法详解
2020/02/07 Python
Python smtp邮件发送模块用法教程
2020/06/15 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
css3实现文字扫光渐变动画效果的示例
2017/11/07 HTML / CSS
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
荷兰网上药店:Drogisterij.net
2019/09/03 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
董事长职责范文
2013/11/08 职场文书
幼儿园英语教学反思
2014/01/30 职场文书
高中运动会入场词
2014/02/14 职场文书
文化与传播毕业生求职信
2014/03/09 职场文书
保护环境的标语
2014/06/09 职场文书
工作求职信
2014/07/04 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
导游词之上饶龟峰
2019/10/25 职场文书
python实现自动化群控的步骤
2021/04/11 Python
PHP中strval()函数实例用法
2021/06/07 PHP