在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生成随机验证码的两种方法
Dec 22 Python
50行Python代码实现人脸检测功能
Jan 23 Python
TensorFlow神经网络优化策略学习
Mar 09 Python
python生成lmdb格式的文件实例
Nov 08 Python
python itchat给指定联系人发消息的方法
Jun 11 Python
对PyQt5基本窗口控件 QMainWindow的使用详解
Jun 19 Python
Python的形参和实参使用方式
Dec 24 Python
Python函数基本使用原理详解
Mar 19 Python
Python提取视频中图片的示例(按帧、按秒)
Oct 22 Python
python 基于opencv操作摄像头
Dec 24 Python
Python读取ini配置文件传参的简单示例
Jan 05 Python
python 判断字符串当中是否包含字符(str.contain)
Jun 01 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 smarty模版引擎中变量操作符及使用方法
2009/12/11 PHP
PHP获取栏目的所有子级和孙级栏目的ID号示例
2014/04/01 PHP
php实现的CSS更新类实例
2014/09/22 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
才发现的超链接js导致网页中GIF动画停止的解决方法
2007/11/02 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
JQuery中如何传递参数如click(),change()等具体实现
2013/04/28 Javascript
Jquery操作js数组及对象示例代码
2014/05/11 Javascript
在Javascript中处理字符串之big()方法的使用
2015/06/08 Javascript
JavaScript各类型的关系图解
2015/10/16 Javascript
浅析jQuery移动开发中内联按钮和分组按钮的编写
2015/12/04 Javascript
javascript日期验证之输入日期大于等于当前日期
2015/12/13 Javascript
jQuery在ie6下无法设置select选中的解决方法详解
2016/09/20 Javascript
基于javascript实现最简单选项卡切换
2017/02/01 Javascript
JS运动特效之同时运动实现方法分析
2018/01/24 Javascript
cropper js基于vue的图片裁剪上传功能的实现代码
2018/03/01 Javascript
JavaScript循环遍历你会用哪些之小结篇
2018/09/28 Javascript
vue input输入框关键字筛选检索列表数据展示
2020/10/26 Javascript
12 种使用Vue 的最佳做法
2020/03/30 Javascript
js实现简单的轮播图效果
2020/12/13 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
python Matplotlib画图之调整字体大小的示例
2017/11/20 Python
Python if语句知识点用法总结
2018/06/10 Python
python实现读取excel文件中所有sheet操作示例
2019/08/09 Python
Django通过dwebsocket实现websocket的例子
2019/11/15 Python
HTML5 Canvas 实现K线图的示例代码
2019/12/23 HTML / CSS
DJI大疆无人机官方商城:全球领先的无人飞行器研发和生产商
2016/12/21 全球购物
Banggood官网:面向全球客户的综合商城
2017/04/19 全球购物
为什么会有内存对齐
2016/10/10 面试题
农村婚礼证婚词
2014/01/10 职场文书
三年级学生评语
2014/04/23 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
竞聘演讲稿怎么写
2014/08/28 职场文书
浅谈MySQL next-key lock 加锁范围
2021/06/07 MySQL
Python进程池与进程锁之语法学习
2022/04/11 Python