首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在查询PostgreSQL数据库的黑盒函数上使用multiprocessing.Pool时出现"InterfaceError:连接已关闭“

在查询PostgreSQL数据库的黑盒函数上使用multiprocessing.Pool时出现"InterfaceError:连接已关闭“
EN

Stack Overflow用户
提问于 2017-06-23 22:52:35
回答 1查看 645关注 0票数 2

我得到了一个Python (2.7)函数,它接受3个字符串作为参数,并返回一个字典列表。由于项目的性质,我不能更改函数,因为它非常复杂,需要调用其他几个非标准的Python模块并使用psychopg2查询PostgreSQL数据库。我认为是Postgres的功能给我带来了问题。

我想使用多处理模块将函数的调用速度提高数百倍。我写了一个“助手”函数,这样我就可以在我的函数中使用multiprocessing.Pool (它只有一个参数):

代码语言:javascript
复制
from function_script import function

def function_helper(args):
    return function(*args)

我的主要代码如下所示:

代码语言:javascript
复制
from helper_script import function_helper
from multiprocessing import Pool

argument_a = ['a0', 'a1', ..., 'a99']
argument_b = ['b0', 'b1', ..., 'b99']
argument_c = ['c0', 'c1', ..., 'c99']

input = zip(argument_a, argument_b, argument_c)
p = Pool(4)
results = p.map(function_helper, input)

print results

我期望的是字典列表的列表,但是我得到了以下错误:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/local/python/2.7/lib/python2.7/site-packages/variantValidator/variantValidator.py", line 898, in validator
    vr.validate(input_parses)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/validator.py", line 33, in validate
    return self._ivr.validate(var, strict) and self._evr.validate(var, strict)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/validator.py", line 69, in validate
    (res, msg) = self._ref_is_valid(var)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/validator.py", line 89, in _ref_is_valid
    var_x = self.vm.c_to_n(var) if var.type == "c" else var
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/variantmapper.py", line 223, in c_to_n
    tm = self._fetch_TranscriptMapper(tx_ac=var_c.ac, alt_ac=var_c.ac, alt_aln_method="transcript")
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/decorators/lru_cache.py", line 176, in wrapper
    result = user_function(*args, **kwds)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/variantmapper.py", line 372, in _fetch_TranscriptMapper
    self.hdp, tx_ac=tx_ac, alt_ac=alt_ac, alt_aln_method=alt_aln_method)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/transcriptmapper.py", line 69, in __init__
    self.tx_identity_info = hdp.get_tx_identity_info(self.tx_ac)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/decorators/lru_cache.py", line 176, in wrapper
    result = user_function(*args, **kwds)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/dataproviders/uta.py", line 353, in get_tx_identity_info
    rows = self._fetchall(self._queries['tx_identity_info'], [tx_ac])
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/dataproviders/uta.py", line 216, in _fetchall
    with self._get_cursor() as cur:
  File "/local/python/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/dataproviders/uta.py", line 529, in _get_cursor
    cur.execute("set search_path = " + self.url.schema + ";")
  File "/local/python/2.7/lib/python2.7/site-packages/psycopg2/extras.py", line 144, in execute
    return super(DictCursor, self).execute(query, vars)
DatabaseError: SSL error: decryption failed or bad record mac

和:

代码语言:javascript
复制
Traceback (most recent call last):
  File "/local/python/2.7/lib/python2.7/site-packages/variantValidator/variantValidator.py", line 898, in validator
    vr.validate(input_parses)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/validator.py", line 33, in validate
    return self._ivr.validate(var, strict) and self._evr.validate(var, strict)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/validator.py", line 69, in validate
    (res, msg) = self._ref_is_valid(var)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/validator.py", line 89, in _ref_is_valid
    var_x = self.vm.c_to_n(var) if var.type == "c" else var
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/variantmapper.py", line 223, in c_to_n
    tm = self._fetch_TranscriptMapper(tx_ac=var_c.ac, alt_ac=var_c.ac, alt_aln_method="transcript")
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/decorators/lru_cache.py", line 176, in wrapper
    result = user_function(*args, **kwds)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/variantmapper.py", line 372, in _fetch_TranscriptMapper
    self.hdp, tx_ac=tx_ac, alt_ac=alt_ac, alt_aln_method=alt_aln_method)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/transcriptmapper.py", line 69, in __init__
    self.tx_identity_info = hdp.get_tx_identity_info(self.tx_ac)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/decorators/lru_cache.py", line 176, in wrapper
    result = user_function(*args, **kwds)
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/dataproviders/uta.py", line 353, in get_tx_identity_info
    rows = self._fetchall(self._queries['tx_identity_info'], [tx_ac])
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/dataproviders/uta.py", line 216, in _fetchall
    with self._get_cursor() as cur:
  File "/local/python/2.7/lib/python2.7/contextlib.py", line 17, in __enter__
    return self.gen.next()
  File "/local/python/2.7/lib/python2.7/site-packages/hgvs/dataproviders/uta.py", line 526, in _get_cursor
    conn.autocommit = True
InterfaceError: connection already closed

在我尝试过的其他示例中,Pool函数看起来很简单,但有人知道是什么原因导致它的行为是这样的吗?如果这还不够深入,有没有人能给我一些建议,让我找出问题的根源(这是我第一次使用别人的代码)?或者,有没有其他方法可以让我使用多处理模块来调用函数数百次?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2018-08-23 08:33:41

我认为可能发生的情况是,您的连接对象在所有工作进程中使用,当一个工作进程完成其所有任务时,它将关闭连接,同时其他工作进程仍在工作,连接被关闭,因此当其中一个进程尝试使用数据库时,它已经关闭。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44724377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档