我正在使用Python 3.6.8,并且具有需要运行77次的功能。我传入的数据是从PostgreSQL中提取数据,然后进行统计分析,然后再放回数据库中。我一次只能运行3个进程,因为一次运行需要很长时间(每个函数调用大约需要10分钟),而我一次只能打开3个DB连接。我正在尝试使用多处理的轮询库,并且试图一次启动所有它们,这会导致太多连接错误。我是否正确使用了轮询方法,如果不是,我应该用来限制同时启动和结束的3个功能。


def AnalysisOf3Years(data):
    FUNCTION RAN HERE
######START OF THE PROGRAM######
print("StartTime ((FINAL 77)): ", datetime.now())
con = psycopg2.connect(host="XXX.XXX.XXX.XXX", port="XXXX", user="USERNAME", password="PASSWORD", dbname="DATABASE")
cur = con.cursor()
date = datetime.today()
cur.execute("SELECT Value FROM table")
Array = cur.fetchall()
Data = []
con.close()
for value in Array:
    Data.append([value,date])
p = Pool(3)
p.map(AnalysisOf3Years,Data)
print("EndTime ((FINAL 77)): ", datetime.now())

最佳答案

似乎您只需要短暂的数据库连接,而大量的脚本花费在处理数据上。在这种情况下,您可能希望将数据提取一次,然后将数据写入磁盘。然后,您可以在程序的每个新实例中从磁盘重新加载此数据,而不必担心与数据库的连接限制。

如果要研究连接池,则希望使用pgbouncer。这是一个独立的程序,位于您的主程序和数据库之间,汇集了您分配给它的连接数。然后,您可以自由地将脚本作为单线程程序编写,并且可以生成机器可以应付的尽可能多的实例。

由于缩进似乎是错误的,很难说出您的程序为什么行为不当。但据猜测,您似乎没有在__main__保护旁边使用池。在某些操作系统上,这可能会导致各种奇怪的问题。

您会期望行为良好的代码看起来像这样:

from multiprocessing import Pool

def double(x):
    return x * 2

if __name__ == '__main__':
    # means pool only gets created in the main parent process and not in the child pool processes
    with Pool(3) as pool:
        result = pool.map(double, range(5))
    assert result == [0, 2, 4, 6, 8, 10]

关于python - Python多处理约束。仅限3个数据库连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59184581/

10-10 17:34
查看更多