2015-09-21 18 views
7

Tôi quan sát hành vi này khi cố tạo các quy trình con lồng nhau trong Python. Dưới đây là chương trình cha mẹ parent_process.py:Tạo các tiến trình con bên trong một tiến trình con với sự đa xử lý Python không thành công

import multiprocessing 
import child_process 

pool = multiprocessing.Pool(processes=4) 
for i in range(4): 
     pool.apply_async(child_process.run,()) 
pool.close() 
pool.join() 

Chương trình cha mẹ gọi là "chạy" chức năng trong chương trình con child_process.py sau:

import multiprocessing 

def run(): 
     pool = multiprocessing.Pool(processes=4) 
     print 'TEST!' 
     pool.close() 
     pool.join() 

Khi tôi chạy chương trình cha mẹ, không có gì được in ra và chương trình đã thoát nhanh. Tuy nhiên, nếu print 'TEST!' được di chuyển một dòng ở trên (trước khi các quy trình con lồng nhau được tạo), 'TEST!' được in 4 lần.

Vì lỗi trong quá trình con sẽ không in ra màn hình, điều này dường như cho thấy chương trình bị treo khi quá trình con tạo quy trình con lồng nhau của riêng nó.

Có ai có thể giải thích điều gì xảy ra sau hậu trường không? Cảm ơn!

+0

Tôi biết có giới hạn trong việc lồng làm tăng Ngoại trừ ion, nhưng bạn ở xa nó trong trường hợp này. Tôi nghĩ vấn đề ở một nơi khác, có thể trong cơ chế 'hồ bơi' ... – CoMartel

+0

Bạn đang cố gắng cải thiện điều gì với điều này? Bạn sẽ không nhanh hơn bằng cách khởi chạy các pool 'Pool' hơn là khởi chạy' Pool' – CoMartel

+0

@HarryPotfleur lớn hơn. Mục đích là để cho mỗi tiến trình con quản lý bộ quy trình riêng của nó, vì vậy chương trình trông sạch hơn về mặt logic. Nói rằng tôi có 16 lõi, sau đó các quy trình lồng nhau 4x4 có thể chạy đồng thời. Tôi cung cấp một giải pháp thay thế bên dưới. –

Trả lời

4

Theo tài liệu multiprocessing, quy trình daemonic không thể sinh ra quy trình con.

multiprocessing.Pool sử dụng quy trình daemonic để đảm bảo chúng không bị rò rỉ khi chương trình của bạn mở rộng.

1

Như noxdafox đã nói, multiprocessing.Pool sử dụng quy trình daemonic. Tôi tìm thấy một workaround đơn giản mà sử dụng multiprocess.Process thay vì:

chương trình phụ huynh:

import multiprocessing 
import child_process 

processes = [None] * 4 
for i in range(4): 
    processes[i] = multiprocessing.Process(target=child_process.run, args=(i,)) 
    processes[i].start() 
for i in range(4): 
    processes[i].join() 

chương trình Trẻ em (với tên child_process.py):

import multiprocessing 

def test(info): 
    print 'TEST', info[0], info[1] 

def run(proc_id): 
    pool = multiprocessing.Pool(processes=4) 
    pool.map(test, [(proc_id, i) for i in range(4)]) 
    pool.close() 
    pool.join() 

Đầu ra là 16 dòng TEST:

TEST 0 0 
TEST 0 1 
TEST 0 3 
TEST 0 2 
TEST 2 0 
TEST 2 1 
TEST 2 2 
TEST 2 3 
TEST 3 0 
TEST 3 1 
TEST 3 3 
TEST 3 2 
TEST 1 0 
TEST 1 1 
TEST 1 2 
TEST 1 3 
Các vấn đề liên quan