【问题标题】:How do I make PySolr drop a connection?如何让 PySolr 断开连接?
【发布时间】:2017-06-22 14:51:12
【问题描述】:

我正在为 300 多个客户制作时间序列图表。 单独拉取每个客户端对我们是有益的,因为合并后的数据非常庞大,并且在某些情况下,客户端数据会以稍微不同的方式重新采样或操作。

我的问题是,当请求完成并且函数返回数据时,我循环获取每个客户端数据的函数会打开 3 个新线程,但从不关闭线程(我假设连接保持打开状态)。

获得客户端的结果后,我想关闭该连接。我只是不知道该怎么做,也无法在我的搜索中找到任何东西。

def solr_data_pull(submitterId): 
    zookeeper= pysolr.ZooKeeper('ndhhadr1dnp11,ndhhadr1dnp12,ndhhadr1dnp13:2181/solr')
    solr = pysolr.SolrCloud(zookeeper, collection='tran_timings', timeout=60)

    query = ('SubmitterId:'+ str(submitterId) +' AND Tier:'+tier+' AND Mode:'+mode+' '
             'AND Timestamp:['+ str(start_period)+' TO '+ str(end_period)+ '] ')

    results = solr.search(rows=50000, q=[query], fl=[fl_list])

    return(pd.DataFrame(list(results)))

【问题讨论】:

  • 有什么理由至少不能在每次solr_data_pull 调用之间保持 ZK 连接处于活动状态以避免每次连接开销?

标签: python pandas solr pysolr


【解决方案1】:

PySolr uses the Session object from requests as its underlying library(它又使用 urllib3s 连接池),因此调用 solr.get_session().close() 应该关闭所有连接并耗尽池:

def close(self):
    """Closes all adapters and as such the session"""

SolrCloudSolr 的扩展,具有get_session() 方法。)

对于断开与 Zookeeper 的连接 - 如果它是一个长时间运行的会话,你可能不应该这样做,因为它必须再次设置手表等,你可以在你的 SolrCloud 实例上 use the .zk object directly - zk 是一个 @987654323 @:

stop()
Gracefully stop this Zookeeper session.

close()
Free any resources held by the client.

This method should be called on a stopped client before 
it is discarded. Not doing so may result in filehandles 
being leaked.

【讨论】:

  • 感谢您的回复。将来可能对我有帮助,但现在还没有实际意义。我们决定一次拉取所有数据,并添加一个额外的功能来拆分客户端,进行单独处理,然后将它们重新组合成一个主数据帧。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 2011-02-03
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多