在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 的 Socket 编程
Mar 24 Python
python实现批量改文件名称的方法
May 25 Python
Python常用小技巧总结
Jun 01 Python
简单谈谈python的反射机制
Jun 28 Python
python中字符串变二维数组的实例讲解
Apr 03 Python
python3+PyQt5图形项的自定义和交互 python3实现page Designer应用程序
Jul 20 Python
基于Django静态资源部署404的解决方法
Jul 28 Python
Python操作qml对象过程详解
Sep 26 Python
Python+OpenCV实现图像的全景拼接
Mar 05 Python
python定时截屏实现
Nov 02 Python
C站最全Python标准库总结,你想要的都在这里
Jul 03 Python
尝试使用Python爬取城市租房信息
Apr 12 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错误日志 display_errors与log_errors的区别
2012/10/09 PHP
基于PHP静态类的原罪详解
2013/05/06 PHP
php5.5新数组函数array_column使用
2013/07/08 PHP
PHP COOKIE及时生效的方法介绍
2014/02/14 PHP
PHPAnalysis中文分词类详解
2014/06/13 PHP
php中getservbyport与getservbyname函数用法实例
2014/11/18 PHP
详解PHP安装mysql.so扩展的方法
2016/12/31 PHP
thinkPHP通用控制器实现方法示例
2017/11/23 PHP
PHP实时统计中文字数和区别
2019/02/28 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
JS保留两位小数,多位小数的示例代码
2014/01/07 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
jquery checkbox的相关操作总结
2016/10/17 Javascript
js图片上传的封装代码
2017/08/01 Javascript
nodejs socket服务端和客户端简单通信功能
2017/09/14 NodeJs
微信小程序实现bindtap等事件传参
2019/04/08 Javascript
vue实现页面内容禁止选中功能,仅输入框和文本域可选
2019/11/09 Javascript
NodeJS配置CORS实现过程详解
2020/12/02 NodeJs
python通过urllib2爬网页上种子下载示例
2014/02/24 Python
python数据结构之二叉树的统计与转换实例
2014/04/29 Python
python内置函数:lambda、map、filter简单介绍
2017/11/16 Python
基于Pandas读取csv文件Error的总结
2018/06/15 Python
Rakuten Kobo台湾:电子书、eReaders和Reading应用程式
2017/11/24 全球购物
局域网定义和特性
2016/01/23 面试题
网站设计师的岗位职责
2013/11/21 职场文书
学习党的群众路线教育实践活动心得体会
2014/03/01 职场文书
小学学校门卫岗位职责
2014/08/03 职场文书
文明单位创建材料
2014/12/24 职场文书
任命书怎么写
2015/03/02 职场文书
创作书写之导游词实用技巧分享(干货)
2019/12/20 职场文书
快速学习Oracle触发器和游标
2021/06/30 Oracle
Nginx stream 配置代理(Nginx TCP/UDP 负载均衡)
2021/11/17 Servers
Mysql分库分表之后主键处理的几种方法
2022/02/15 MySQL
Elasticsearch6.2服务器升配后的bug(避坑指南)
2022/09/23 Servers