2012-03-17 23 views
9

Tôi cần phải tạo một đối tượng được chia sẻ của một mảng đa chiều hoặc danh sách các danh sách để nó có sẵn cho các quy trình khác. Có cách nào để tạo ra nó như cho những gì tôi đã thấy nó là không thể. Tôi đã thử:Tôi có thể tạo multiarray hoặc danh sách đối tượng danh sách được chia sẻ trong python để đa xử lý không?

from multiprocessing import Process, Value, Array 
arr = Array('i', range(10)) 
arr[:] 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9] 
arr[2]=[12,43] 
TypeError: an integer is required 

tôi nghe NumPy mảng có thể multiarray và một đối tượng chia sẻ, nếu ở trên là không thể ai đó có thể cho tôi biết làm thế nào để làm cho một mảng NumPy một đối tượng chia sẻ ??

+0

Tôi không chắc chắn về phần đa xử lý, nhưng tôi biết tại sao bạn nhận được TypeError ở đó: Bạn đã khởi tạo mảng của mình cho các giá trị số nguyên trong dòng thứ hai. Trong dòng thứ 5, bạn cố gán một danh sách cho một điểm trong mảng. Mảng là đối tượng mức tương đối thấp và không thể giữ danh sách, dicts, bộ và các loại container python khác. –

+0

Vâng đó là những gì tôi biết, tôi biết tại sao tôi nhận được TypeError. Đó là lý do tại sao tôi hỏi nếu có cách nào vượt qua vấn đề này, hoặc tạo một đối tượng chia sẻ "List", hoặc có thể làm thế nào để sử dụng Numpy Arrays có thể là đa điểm và làm cho chúng được chia sẻ các đối tượng. – user1249212

+0

Xem lại các mục này. Sau đó, xây dựng một cấu trúc dữ liệu xung quanh chúng: http://effbot.org/pyfaq/what-kinds-of-global-value-mutation-are-thread-safe.htm. – MrGomez

Trả lời

21

Để thực hiện một mảng NumPy một đối tượng chia sẻ (full example):

import ctypes as c 
import numpy as np 
import multiprocessing as mp 

n, m = 2, 3 
mp_arr = mp.Array(c.c_double, n*m) # shared, can be used from multiple processes 
# then in each new process create a new numpy array using: 
arr = np.frombuffer(mp_arr.get_obj()) # mp_arr and arr share the same memory 
# make it two-dimensional 
b = arr.reshape((n,m)) # b and arr share the same memory 

Nếu bạn không cần một chia sẻ (như trong "chia sẻ bộ nhớ cùng") đối tượng và chỉ đối tượng có thể được sử dụng từ nhiều quy trình là đủ thì bạn có thể sử dụng multiprocessing.Manager:

from multiprocessing import Process, Manager 

def f(L): 
    row = L[0] # take the 1st row 
    row.append(10) # change it 
    L[0] = row #NOTE: important: copy the row back (otherwise parent 
       #process won't see the changes) 

if __name__ == '__main__': 
    manager = Manager() 

    lst = manager.list() 
    lst.append([1]) 
    lst.append([2, 3]) 
    print(lst) # before: [[1], [2, 3]] 

    p = Process(target=f, args=(lst,)) 
    p.start() 
    p.join() 

    print(lst) # after: [[1, 10], [2, 3]] 

từ the docs:

Trình quản lý quy trình máy chủ linh hoạt hơn sử dụng bộ nhớ dùng chung đối tượng vì chúng có thể được tạo để hỗ trợ các loại đối tượng tùy ý. Ngoài ra, một người quản lý có thể được chia sẻ theo các quy trình trên các máy tính khác nhau qua mạng. Tuy nhiên, chúng chậm hơn so với sử dụng bộ nhớ chia sẻ .

+0

Điều này dường như là một giải pháp tuyệt vời, tôi nghĩ rằng tôi sẽ sử dụng các nhà quản lý vì chúng dường như là một giải pháp thay đổi mã của tôi và thực tế là nó thậm chí có thể hoạt động trên mạng. dự án. – user1249212

+0

chỉ là một câu hỏi nhanh, các nhà quản lý sẽ tạo một bản sao mới của danh sách và sau đó đồng bộ hóa nó giữa các quá trình hoặc nó sẽ chia sẻ bộ nhớ từ danh sách? – user1249212

+0

@ user1249212: Tạo mô hình như thể các quy trình luôn được phân phối qua mạng. – jfs

2

Tại sao không tạo danh sách Array s?

arrays = [Array('i', range(10))] * 10 
+0

Trên thực tế mooooeeeep đã đề cập đến nó trong [câu trả lời trước] (http://stackoverflow.com/a/9743806/1258041) –

+0

Đó là bởi vì tôi nghĩ rằng không tồn tại đối tượng được chia sẻ cho danh sách và cách tôi đã làm mã của tôi chức năng phải nhận thức (ít nhất một trong các hàng ma trận1 và tất cả các hàng của ma trận2). Tôi biết có rất nhiều cách khác mà tôi có thể dễ dàng tổ chức lại ma trận của tôi cho tôi không cần chia sẻ nhiều mảng hoặc danh sách các danh sách, nhưng tôi muốn biết tất cả các khả năng về cách thực hiện. – user1249212

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