Tôi đang sử dụng multiprocessing.Pool()
multiprocessing.pool.map và chức năng với hai đối số
đây là những gì tôi muốn bơi:
def insert_and_process(file_to_process,db):
db = DAL("path_to_mysql" + db)
#Table Definations
db.table.insert(**parse_file(file_to_process))
return True
if __name__=="__main__":
file_list=os.listdir(".")
P = Pool(processes=4)
P.map(insert_and_process,file_list,db) # here having problem.
Tôi muốn vượt qua 2 đối số gì tôi muốn làm là để chỉ khởi tạo 4 kết nối DB (ở đây sẽ cố gắng tạo kết nối trên mọi cuộc gọi hàm để có thể có hàng triệu cuộc gọi và khiến IO bị đóng băng đến chết). nếu tôi có thể tạo ra 4 kết nối db và 1 cho mỗi quá trình nó sẽ là ok.
Có giải pháp nào cho Hồ bơi không? hay tôi nên từ bỏ nó?
EDIT:
Từ sự giúp đỡ của cả hai bạn tôi đã nhận điều này bằng cách thực hiện điều này:
args=zip(f,cycle(dbs))
Out[-]:
[('f1', 'db1'),
('f2', 'db2'),
('f3', 'db3'),
('f4', 'db4'),
('f5', 'db1'),
('f6', 'db2'),
('f7', 'db3'),
('f8', 'db4'),
('f9', 'db1'),
('f10', 'db2'),
('f11', 'db3'),
('f12', 'db4')]
Vì vậy, ở đây nó như thế nào nó sẽ làm việc, Tôi gonna di chuyển mã kết nối DB ra đến mức chính và làm điều này:
def process_and_insert(args):
#Table Definations
args[1].table.insert(**parse_file(args[0]))
return True
if __name__=="__main__":
file_list=os.listdir(".")
P = Pool(processes=4)
dbs = [DAL("path_to_mysql/database") for i in range(0,3)]
args=zip(file_list,cycle(dbs))
P.map(insert_and_process,args) # here having problem.
Vâng, tôi sẽ kiểm tra và cho các bạn biết.
Lưu ý rằng cú pháp 'def f ((arg1, arg2)):' biến mất trong Python 3. –
@FerdinandBeyer: Tôi đã quên điều đó. Vâng, trừ khi thực hiện multiprocessing.Pool.map là khác nhau ở đó, con đường để đi sẽ được giao cho một đối số duy nhất, và giải nén nó bên trong chức năng sau đó. – jsbueno
Cảm ơn tôi đã làm việc đó! tôi đã nhận nó bằng cách làm zip (file_list, chu kỳ (dbs)). Nhưng tôi không sử dụng f ((arg1, arg2)). khi tôi sử dụng nhiều mã của bạn, tôi đã chọn bạn! –