Tôi cần chạy một hàm trong một tiến trình, được tách biệt hoàn toàn với tất cả bộ nhớ khác, nhiều lần. Tôi muốn sử dụng multiprocessing
cho điều đó (vì tôi cần serialize một đầu ra phức tạp đến từ các chức năng). Tôi đặt số start_method
thành 'spawn'
và sử dụng hồ bơi với maxtasksperchild=1
. Tôi mong chờ để có được một quá trình khác nhau cho mỗi công việc, và do đó thấy một PID khác nhau:multiprocessing.Pool với maxtasksperchild tạo ra các PID bằng nhau
import multiprocessing
import time
import os
def f(x):
print("PID: %d" % os.getpid())
time.sleep(x)
complex_obj = 5 #more complex axtually
return complex_obj
if __name__ == '__main__':
multiprocessing.set_start_method('spawn')
pool = multiprocessing.Pool(4, maxtasksperchild=1)
pool.map(f, [5]*30)
pool.close()
Tuy nhiên đầu ra tôi nhận được là:
$ python untitled1.py
PID: 30010
PID: 30009
PID: 30012
PID: 30011
PID: 30010
PID: 30009
PID: 30012
PID: 30011
PID: 30018
PID: 30017
PID: 30019
PID: 30020
PID: 30018
PID: 30019
PID: 30017
PID: 30020
...
Vì vậy, các quá trình không được respawned sau mỗi nhiệm vụ . Có cách tự động để nhận được một PID mới mỗi lần (tức là không có bắt đầu một hồ bơi mới cho mỗi bộ quy trình)?