Python多处理。同时完成所有流程

Python多处理。同时完成所有流程,python,locking,multiprocessing,semaphore,psycopg2,Python,Locking,Multiprocessing,Semaphore,Psycopg2,我的目标是将一些数据上传到数据库。我使用的是psycopg2,它有一条规则:所有进程都必须有自己的数据库连接。就我而言,这意味着我必须在工作中做出承诺。问题是我只能提交所有进程finishsqlinsert命令。我需要的是: from multiprocessing import Process def worker1(s): conn = psycopg2.connect("dbname=mydb user=postgres") cursor = conn.curso

我的目标是将一些数据上传到数据库。我使用的是psycopg2,它有一条规则:所有进程都必须有自己的数据库连接。就我而言,这意味着我必须在工作中做出承诺。问题是我只能提交所有进程finishsqlinsert命令。我需要的是:

from multiprocessing import Process

def worker1(s):    
    conn = psycopg2.connect("dbname=mydb user=postgres")
    cursor = conn.cursor()

    pg_cursor.execute(
            """ insert into "MyTable1"("Column1")
                values(%s)""", [1])

    #wait all processes
    conn.commit()       

def worker2(s):    
    conn = psycopg2.connect("dbname=mydb user=postgres")
    cursor = conn.cursor()

    pg_cursor.execute(
            """ insert into "MyTable2"("Column1")
                values(%s)""", [1])

    #wait all processes
    conn.commit()

if __name__ == '__main__':
    p1 = Process(target=worker1)
    p2 = Process(target=worker2)
    p1.start()
    p2.start()
如何使所有进程等待直到完成sql命令?正确的方法是什么? 例如,在实际任务中,我需要插入数百万条记录。

您可以使用一对对象让两个工作人员告诉另一个工作人员他们已经完成了,并强制他们等待另一个工作人员发回信号:

from multiprocessing import Process, Event

def worker1(s, my_e, other_e):    
    conn = psycopg2.connect("dbname=mydb user=postgres")
    cursor = conn.cursor()

    pg_cursor.execute(
            """ insert into "MyTable1"("Column1")
                values(%s)""", [1])

    #wait all processes
    my_e.set()
    other_e.wait()
    conn.commit()       

def worker2(s, my_e, other_e):    
    conn = psycopg2.connect("dbname=mydb user=postgres")
    cursor = conn.cursor()

    pg_cursor.execute(
            """ insert into "MyTable2"("Column1")
                values(%s)""", [1])

    #wait all processes
    my_e.set()
    other_e.wait()
    conn.commit()

if __name__ == '__main__':
    e1 = Event()
    e2 = Event()
    p1 = Process(target=worker1, args=(e1, e2))
    p2 = Process(target=worker2, args=(e2, e1))
    p1.start()
    p2.start()
    p1.join()
    p2.join()

如果其中一名员工因某种原因失败,就要小心可能出现僵局。您可能需要将
事件的可选
timeout
关键字参数设置为相当高的值,并在过期时回滚。这或使用一个
try
/
,除了在保证
my_e
获得
set()
的每个工作进程中使用
,但也在两个工作进程之间共享一个变量,该变量可用于在发生故障时通知另一个工作进程。

调用进程上的
.join()
。如果我没有弄错,join使主进程等待所有子进程完成。但我需要子进程互相等待。我在worker中显示了需要暂停子流程的位置。我提供的示例只是一个指南。你必须为你的特殊情况制定出最佳的事件流程。