2015-06-19 25 views
8

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

Trả lời

9

Bạn cũng cần chỉ định chunksize=1 trong cuộc gọi đến pool.map. Nếu không, nhiều mục trong iterable của bạn được nhóm lại với nhau thành một "nhiệm vụ" từ nhận thức của các quá trình lao động:

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, chunksize=1) 
    pool.close() 

Output không đã lặp đi lặp lại PID bây giờ:

PID: 4912 
PID: 4913 
PID: 4914 
PID: 4915 
PID: 4938 
PID: 4937 
PID: 4940 
PID: 4939 
PID: 4966 
PID: 4965 
PID: 4970 
PID: 4971 
PID: 4991 
PID: 4990 
PID: 4992 
PID: 4993 
PID: 5013 
PID: 5014 
PID: 5012 
Các vấn đề liên quan