2015-11-18 23 views
14

Tôi đang cố chạy một vòng lặp song song trên một ví dụ đơn giản.
Tôi đang làm gì sai?Viết một vòng lặp song song

from joblib import Parallel, delayed 
import multiprocessing 

def processInput(i): 
     return i * i 

if __name__ == '__main__': 

    # what are your inputs, and what operation do you want to 
    # perform on each input. For example... 
    inputs = range(1000000)  

    num_cores = multiprocessing.cpu_count() 

    results = Parallel(n_jobs=4)(delayed(processInput)(i) for i in inputs) 

    print(results) 

Vấn đề với mã là khi thực hiện dưới môi trường Windows trong Python 3, nó sẽ mở ra num_cores trường hợp của python để thực hiện các công việc song song nhưng chỉ là một trong những hoạt động. Đây không phải là trường hợp vì hoạt động của bộ vi xử lý phải là 100% thay vì 14% (theo i7 - 8 lõi logic).

Tại sao các trường hợp bổ sung không làm bất cứ điều gì?

+0

Bạn có nhận được thông báo lỗi nào không? Nó chạy tốt cho tôi .... Thụt lề phải là 4 dấu cách thay vì một dấu cách ... –

+0

Tôi có cùng một vấn đề. Vấn đề là mã chỉ chạy trên một lõi không phải trên n-lõi. –

Trả lời

17

Tiếp tục theo yêu cầu của bạn để cung cấp một mã đa xử làm việc, tôi đề nghị bạn nên sử dụng pool_map (nếu chức năng bị trì hoãn không quan trọng), tôi sẽ cung cấp cho bạn một ví dụ, nếu bạn đang làm việc trên python3 giá trị của nó để đề cập đến bạn có thể sử dụng starmap. Cũng đáng nói đến là bạn có thể sử dụng map_sync/starmap_async nếu thứ tự của các kết quả trả về không phải tương ứng với thứ tự của các đầu vào.

import multiprocessing as mp 

def processInput(i): 
     return i * i 

if __name__ == '__main__': 

    # what are your inputs, and what operation do you want to 
    # perform on each input. For example... 
    inputs = range(1000000) 
    # removing processes argument makes the code run on all available cores 
    pool = mp.Pool(processes=4) 
    results = pool.map(processInput, inputs) 
    print(results) 
+0

Tôi thích sự đơn giản này, vì vậy tôi đã thử nó. Tôi nhận được một TypeError: không thể serialize '_io.TextIOWrapper' đối tượng. Chức năng của tôi phức tạp, và tôi không có thời gian để đi sâu vào nó, chỉ là một bình luận về nếu bạn có một chức năng phức tạp, điều này có thể không hoạt động ra khỏi hộp – Nick

+0

Serialization là một phần chính của mỗi chương trình đa tiến trình. Để thử và giảm thiểu các vấn đề như vậy, tôi khuyên bạn nên kiểm tra hàm phức tạp của mình và kiểm tra xem phần nào thực sự cần giải pháp xử lý đa và thử tách nó khỏi hàm phức tạp, điều này sẽ giảm bớt việc tuần tự hóa và thậm chí có thể làm cho nó không cần thiết. – Fanchi

2

Trên Windows, mô-đun đa xử lý sử dụng phương pháp 'đẻ trứng' để khởi động nhiều quy trình thông dịch python. Điều này tương đối chậm. Song song cố gắng thông minh về việc chạy mã. Đặc biệt, nó cố gắng điều chỉnh kích cỡ lô để một lô mất khoảng nửa giây để thực thi. (Xem đối số batch_size tại https://pythonhosted.org/joblib/parallel.html)

Chức năng của bạn chạy nhanh đến mức Parallel xác định rằng việc chạy công việc serially trên một bộ xử lý nhanh hơn để xoay nhiều trình thông dịch python và chạy mã song song.

Nếu bạn muốn buộc ví dụ chạy trên nhiều lõi, hãy thử đặt batch_size thành 1000 hoặc làm cho phức tạp hơn processInput() để mất nhiều thời gian hơn để thực thi.

Chỉnh sửa: Ví dụ làm việc trên cửa sổ cho thấy nhiều quy trình sử dụng (Tôi đang sử dụng Windows 7):

from joblib import Parallel, delayed 
from os import getpid 

def modfib(n): 
    # print the process id to see that multiple processes are used, and 
    # re-used during the job. 
    if n%400 == 0: 
     print(getpid(), n) 

    # fibonacci sequence mod 1000000 
    a,b = 0,1 
    for i in range(n): 
     a,b = b,(a+b)%1000000 
    return b 

if __name__ == "__main__": 
    Parallel(n_jobs=-1, verbose=5)(delayed(modfib)(j) for j in range(1000, 4000)) 
+0

Bạn có thể đề xuất sửa đổi mã để tác vụ được thực thi song song một cách hiệu quả không? Vì mã trên được đưa ra như một ví dụ về việc sử dụng joblib, nên có một ví dụ thực sự hoạt động. –

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