gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-29 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章在Python的gevent框架下执行异步的Solr查询的教程由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

 我经常需要用Python与solr进行异步请求工作。这里有段代码阻塞在Solr http请求上, 直到第一个完成才会执行第二个请求,代码如下:   。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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请求:   。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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代码简洁,但是它能完成相应的工作,代码的精髓是下面几行:   。

?
1
2
3
4
5
6
7
# 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查询的教程的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com