[英]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_e
被set()
但也分享可以用來告訴其他工人如果發生故障兩名工人之間的變量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.