2011-12-01 26 views
5

Tôi hiện đang thử nghiệm với diễn viên-concurreny (trên Python), bởi vì tôi muốn tìm hiểu thêm về điều này. Vì vậy, tôi đã chọn pykka, nhưng khi tôi thử nghiệm, nó lớn hơn một nửa là chậm như một hàm bình thường.pykka - Diễn viên chậm?

Mã chỉ để xem liệu nó có hoạt động hay không; nó không có nghĩa là phải thanh lịch. :)

Có thể tôi đã làm điều gì sai?

from pykka.actor import ThreadingActor 
import numpy as np 

class Adder(ThreadingActor): 
    def add_one(self, i): 
     l = [] 
     for j in i: 
      l.append(j+1) 
     return l 

if __name__ == '__main__': 
    data = np.random.random(1000000) 
    adder = Adder.start().proxy() 
    adder.add_one(data) 
    adder.stop() 

Đây không phải chạy quá nhanh:

time python actor.py 

real 0m8.319s 
user 0m8.185s 
sys  0m0.140s 

Và bây giờ là giả 'bình thường' chức năng:

def foo(i): 
    l = [] 
    for j in i: 
     l.append(j+1) 
    return l 

if __name__ == '__main__': 
    data = np.random.random(1000000) 
    foo(data) 

Cung cấp kết quả này:

real 0m3.665s 
user 0m3.348s 
sys  0m0.308s 

Trả lời

12

Vậy là những gì xảy ra ở đây là phiên bản chức năng của bạn đang tạo hai danh sách rất lớn là phần lớn thời gian. Khi bạn giới thiệu diễn viên, dữ liệu có thể thay đổi giống như danh sách phải được sao chép trước khi được gửi đến diễn viên để duy trì đồng thời phù hợp. Ngoài ra danh sách được tạo bên trong diễn viên cũng phải được sao chép khi được gửi lại cho người gửi. Điều này có nghĩa là thay vì hai danh sách rất lớn được tạo ra, chúng tôi có bốn danh sách rất lớn được tạo ra để thay thế.

Cân nhắc thiết kế mọi thứ để dữ liệu được xây dựng và duy trì bởi nam diễn viên và sau đó được truy vấn bằng các cuộc gọi tới diễn viên thu nhỏ kích thước của thông báo được truyền qua lại. Hãy thử áp dụng hiệu trưởng của chuyển động dữ liệu tối thiểu. Việc chuyển danh sách trong trường hợp chức năng chỉ hiệu quả vì dữ liệu không thực sự di chuyển để tận dụng không gian bộ nhớ dùng chung. Nếu diễn viên ở trên một máy khác, chúng tôi sẽ không có lợi ích của không gian bộ nhớ chia sẻ ngay cả khi dữ liệu tin nhắn không thay đổi được và không cần phải sao chép.

+0

Và làm cách nào để tôi thực hiện điều này một cách hiệu quả? Tôi đã làm một tuple ra khỏi mảng numpy, nhưng đạt được không phải là rất cao. (Ví dụ: phân phối hiệu quả vòng lặp trên các tác nhân chủ.) – Themerius

+0

Tôi đã cập nhật câu trả lời của mình. Về cơ bản nó là khó khăn hơn để thiết kế nhưng nó có nhiều lợi ích hơn như thực hiện trên một cụm máy. –

+0

Cảm ơn bạn, tôi cố gắng để xây dựng một cái gì đó. – Themerius

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