簡體   English   中英

Python多處理。 同時完成所有流程

[英]Python multiprocessing. Finish all processes at the same time

我的目標是將一些數據上傳到數據庫。 我正在使用psycopg2,它有一條規則:所有進程都必須具有自己的數據庫連接。 就我而言,這意味着我必須從事工人工作。 問題是我只能提交所有完成sql insert命令的進程。 我需要的:

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命令? 正確的方法是什么? 例如,此sql插入僅在實際任務中需要插入數百萬條記錄。

您可以使用一對multiprocessing.Event對象,以允許兩個工作人員告訴對方他們已經完成,並強迫他們等待對方發出信號:

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()

如果其中一個工人由於某種原因而失敗,請當心死鎖的可能性。 您可能希望將Event.wait的可選timeout關鍵字參數Event.wait為一個相當高的值,如果過期則回滾。 這或使用try / except在保證每個工人my_eset()但也分享可以用來告訴其他工人如果發生故障兩名工人之間的變量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM