I used multiprocessing pool in Python3 to connect database(Postgresql).I created database connections with multiprocessing.Pool(8,init_dbconn),and do some dml with pool.map(update, records).Obviously I can get better performance if I do commit after pool.map rather than each iteration in pool.map().So I define another function to call dbconnection.commit,and run pool.map(func_commit, range(8), 1) after pool.map(update),but I found the pool don't distribute tasks to each child process at least one time, even I increase the size or range() to do more iteration. So some of database connection didn't commit the dml. Is there any method to achieve this function?
The pseudo-code like this:
def conn_db():
try:
conn = psycopg2.connect(database="dbname", user="username", password="pass", host="127.0.0.1", port="5432")
return (conn)
except:
print(traceback.format_exc())
def init_proc():
global conn
conn = conn_db()
global cursor
cursor = conn.cursor()
def double2(i):
print ("I'm process:%s, %s" % (os.getpid(), multiprocessing.current_process()))
return i*2
def exec_ten_parallel(num_parallel, records):
try:
pool = Pool(8, initializer=init_proc)
t1_b = time.time()
pool.imap(double2, range(16), 1)
#for i in range(16):
# pool.apply_async(double2,(1,))
pool.close()
pool.join()
t1_runtime = time.time() - t1_b
#print('update all count:', len(records), 'seconds:', t1_runtime)
except:
print(traceback.format_exc())
I print the worker name and pid, as shown below
I'm process:53141, <ForkProcess(ForkPoolWorker-1, started daemon)>
I'm process:53141, <ForkProcess(ForkPoolWorker-1, started daemon)>
I'm process:53142, <ForkProcess(ForkPoolWorker-2, started daemon)>
I'm process:53141, <ForkProcess(ForkPoolWorker-1, started daemon)>
I'm process:53141, <ForkProcess(ForkPoolWorker-1, started daemon)>
I'm process:53142, <ForkProcess(ForkPoolWorker-2, started daemon)>
I'm process:53141, <ForkProcess(ForkPoolWorker-1, started daemon)>
I'm process:53141, <ForkProcess(ForkPoolWorker-1, started daemon)>
[root@dc3-06-005 dml-test]# python3 bak-p.py
I'm process:53164, <ForkProcess(ForkPoolWorker-3, started daemon)>
I'm process:53164, <ForkProcess(ForkPoolWorker-3, started daemon)>
I'm process:53164, <ForkProcess(ForkPoolWorker-3, started daemon)>
I'm process:53164, <ForkProcess(ForkPoolWorker-3, started daemon)>
I'm process:53164, <ForkProcess(ForkPoolWorker-3, started daemon)>
I'm process:53164, <ForkProcess(ForkPoolWorker-3, started daemon)>
I'm process:53164, <ForkProcess(ForkPoolWorker-3, started daemon)>
I'm process:53164, <ForkProcess(ForkPoolWorker-3, started daemon)>
Almost could not run all ForkPoolWorker, just only call one or two worker do job.