2012-10-16 31 views
9

Tôi có những trường hợp rất đơn giản, nơi công việc được thực hiện có thể được chia nhỏ và phân phối giữa các công nhân. Tôi đã thử một ví dụ rất đơn giản đa từ here:Sản lượng tương tự trong các công nhân khác nhau trong đa xử lý

import multiprocessing 
import numpy as np 
import time 

def do_calculation(data): 
    rand=np.random.randint(10) 
    print data, rand 
    time.sleep(rand) 
    return data * 2 

if __name__ == '__main__': 
    pool_size = multiprocessing.cpu_count() * 2 
    pool = multiprocessing.Pool(processes=pool_size) 

    inputs = list(range(10)) 
    print 'Input :', inputs 

    pool_outputs = pool.map(do_calculation, inputs) 
    print 'Pool :', pool_outputs 

Chương trình trên sẽ cho kết quả như sau:

Input : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
0 7 
1 7 
2 7 
5 7 
3 7 
4 7 
6 7 
7 7 
8 6 
9 6 
Pool : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] 

Tại sao các số ngẫu nhiên cùng bị in? (Tôi có 4 cpus trong máy của tôi). Đây có phải là cách tốt nhất/đơn giản nhất để tiếp tục không?

+0

thể trùng lặp của [Sử dụng đa python với hạt giống ngẫu nhiên khác nhau cho mỗi process] (http://stackoverflow.com/questions/9209078/using-python-multiprocessing-with-different- ngẫu nhiên-seed-cho-mỗi-quá trình) –

+0

Không có cách nào để thiết lập số ngẫu nhiên cho mỗi quá trình có thể sử dụng số ngẫu nhiên? Giả sử một người sử dụng mô-đun ngẫu nhiên, numpy, scipy, tensorflow và ai biết những gì khác. Là cách duy nhất để đảm bảo quá trình có một hạt giống ngẫu nhiên khác nhau để đi qua từng cái này và tự thiết lập trạng thái? –

Trả lời

12

Tôi nghĩ bạn cần phải tạo lại trình tạo số ngẫu nhiên bằng cách sử dụng numpy.random.seed trong chức năng do_calculation của bạn.

Đoán của tôi là trình tạo số ngẫu nhiên (RNG) được tạo hạt khi bạn nhập mô-đun. Sau đó, khi bạn sử dụng đa xử lý, bạn chia rẽ quy trình hiện tại với RNG đã được gieo hạt - Vì vậy, tất cả các quy trình của bạn đang chia sẻ cùng một giá trị hạt giống cho RNG và do đó chúng sẽ tạo ra cùng một chuỗi các số.

ví dụ:

def do_calculation(data): 
    np.random.seed() 
    rand=np.random.randint(10) 
    print data, rand 
    return data * 2 
+0

Bạn có thể chỉ cho tôi cách đặt 'seed' trong' do_calculation'. Nếu tôi đặt 'seed' vào' main' thì tôi vẫn nhận được kết quả tương tự. – imsc

+0

@imsc - Rất tiếc, tôi không đọc đủ kỹ. Bạn muốn 'np.random.seed' (không phải' random.seed'). Tôi đã cập nhật cho phù hợp. – mgilson

+0

Tôi vẫn nhận được kết quả tương tự. – imsc

Các vấn đề liên quan