【问题标题】:Multiprocess over python with psycopg2使用 psycopg2 在 python 上进行多进程
【发布时间】:2017-04-12 10:22:16
【问题描述】:

我正在使用 python 将许多记录添加到 Postgres 数据库中,因为我必须插入数百万条记录,我需要并行化 2 个函数:

insert_A(cur)  
insert_B(cur) 

地点:

conn=psycopg2.connect(.....)
cur = conn.cursor() 

我尝试了在堆栈溢出中的另一篇文章中找到的解决方案,例如:

result1= pool.apply_async(insert_A, cur)  
result2= pool.apply_async(insert_B, cur)  
answer1=result1.get(timeout=15)  
answer2=result2.get(timeout=15)  

但我得到了这个错误: 回溯(最近一次通话最后一次):
文件“test.py”,第 387 行,在
answer1=result1.get(超时=15)
文件“/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,第 558 行,在 get
提高自我价值
psycopg2.InterfaceError:光标没有连接

有人可以帮帮我吗? :(

【问题讨论】:

  • 我在另一篇文章中发现的是一种并行化 2 个函数的通用方法,显然与 postgres 及其连接无关...在这里我尝试对其进行调整,但结果...
  • 您是否尝试在函数insert_Ainsert_B 内建立连接?
  • 不,它们在不同的表上工作,我需要一个函数在一个内核上工作,另一个函数在另一个内核上工作
  • 你应该看看how to exchange objects between processes,因为这两个函数将在两个不同的进程上产生
  • 我不明白为什么,因为due函数之间是相互独立的,所以它们不必互相交谈,我只是想有两个进程,每个进程都有自己的功能没有 si 军事与其他部分连接到同一个数据库...

标签: python postgresql multiprocessing psycopg2


【解决方案1】:

正如this issue 报告的那样,psycopg2 无法在单独的进程上使用连接,必须在工作进程中建立连接。

【讨论】:

  • 这对我有帮助,但恕我直言,这不是好的模式。如果您有 10 个工作人员,则同时打开 10 个连接。另一方面,您在连接打开和关闭时浪费了时间。
【解决方案2】:

最后我是这样解决的:

if __name__ == '__main__':
    p = Process(target=insert_A, args=(ARG,))
    q = Process(target=insert_measurement_real, args=(ARG,))
    p.start()
    q.start()
    p.join()
    q.join()

并在函数内部创建连接,而不是在函数外部创建连接(并将连接作为参数传递)...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-31
    • 2016-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多