最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

在Python的gevent框架下执行异步的Solr查询的教程

来源:懂视网 责编:小采 时间:2020-11-27 14:32:38
文档

在Python的gevent框架下执行异步的Solr查询的教程

在Python的gevent框架下执行异步的Solr查询的教程:我经常需要用Python与solr进行异步请求工作。这里有段代码阻塞在Solr http请求上, 直到第一个完成才会执行第二个请求,代码如下: import requests #Search 1 solrResp = requests.get('http://mysolr.com/solr/stat
推荐度:
导读在Python的gevent框架下执行异步的Solr查询的教程:我经常需要用Python与solr进行异步请求工作。这里有段代码阻塞在Solr http请求上, 直到第一个完成才会执行第二个请求,代码如下: import requests #Search 1 solrResp = requests.get('http://mysolr.com/solr/stat

我经常需要用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的gevent框架下执行异步的Solr查询的教程

在Python的gevent框架下执行异步的Solr查询的教程:我经常需要用Python与solr进行异步请求工作。这里有段代码阻塞在Solr http请求上, 直到第一个完成才会执行第二个请求,代码如下: import requests #Search 1 solrResp = requests.get('http://mysolr.com/solr/stat
推荐度:
标签: so python 异步
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top