2010-10-08 16 views

Trả lời

15

Tôi có xu hướng sử dụng inlineCallbacks để khởi tạo nhiều bước (chẳng hạn như auth) đối với một số dịch vụ mà mỗi bước tiếp theo phụ thuộc vào kết quả từ bước trước đó. Ngoài những tình huống này, tôi có xu hướng thấy rằng inlineCallbacks có thể dẫn đến lập trình lười biếng có thể làm chậm ứng dụng của bạn.

Dưới đây là một ví dụ:

@defer.inlineCallbacks 
def some_func(): 
    res1 = yield call1() 
    res2 = yield call2() 
    ... do something with res1 and res2 ... 

Nếu call1call2 những cuộc gọi hoàn toàn độc lập mà bạn muốn parallelize, chức năng này sẽ kết thúc serializing những cuộc gọi. Để chuyển đổi cuộc gọi này thành một cuộc gọi song song, bạn nên:

@defer.inlineCallbacks 
def some_func_better(): 
    d1 = call1() 
    d2 = call2() 
    res1 = yield d1 
    res2 = yield d2 

Cách này bạn nhận được cuộc gọi1 và call2 chạy đồng thời, nhưng bạn vẫn có thể nhận được lợi ích tương tự từ cổ phiếu hoãn lại, có vẻ như inlineCallbacks chỉ khiến việc triển khai giải pháp cũ trở nên quá dễ dàng.

Ngoài ra, hãy nhớ rằng bạn vẫn phải quấn try...except khối xung quanh tất cả lệnh gọi lợi nhuận của bạn, vì chúng là cách duy nhất để bẫy lỗi trong mã của bạn (trừ khi hàm gọi hàm inlineCallbacks xử lý lỗi đó cấp độ).

Vì vậy, tôi thấy nó không thực sự là một câu hỏi của hiệu suất cho mỗi gia nhập, nhưng thói quen khá tốt mà có thể làm cho tôi khuyên bạn nên chống inlineCallbacksnói chung - họ vẫn tuyệt vời cho đoạn mã nhanh chóng, nhiều giai đoạn khởi thường xuyên, hoặc kiểm tra.

+0

Đáng ngạc nhiên 'inlineCallbacks' không hỗ trợ' cancel() '. Tôi một lần đã phải viết lại một số chức năng sẵn sàng để đọc để xây dựng lộn xộn của callbacks lồng nhau kể từ khi tôi cần khả năng 'hủy()' quá trình. – Stefan

2

Sự khác biệt thực sự cần phải tinh tế. Nếu mã này thực sự chạy thường xuyên mà nó quan trọng, có lẽ bạn nên nhìn vào thiết kế ứng dụng của bạn. Nếu không, hãy sử dụng biến thể dễ đọc hơn, bạn sẽ phải làm cho đầu và đuôi ra khỏi nó một vài tháng hoặc nhiều năm trên đường. EDIT: Nếu bạn thực sự muốn biết, đây là cách bạn tìm hiểu (nó có thể, sau khi tất cả, được thực hiện cụ thể cho phiên bản python của bạn): chạy cả hai phiên bản trong một vòng lặp chặt chẽ và đo thời gian. Tăng số vòng lặp cho đến khi chênh lệch thời gian giữa các phiên bản lớn hơn nhiều so với chênh lệch thời gian của cùng một phiên bản trên nhiều lần chạy. Lặp lại sau khi thay đổi phiên bản python, OS vv

+0

Ngoài ra, việc thử nghiệm đó trên mã ứng dụng của bạn hữu ích hơn, vì nó phụ thuộc vào cách bạn sử dụng chúng. – Glyph

0

defer.inlineCallbacks sử dụng có thể làm cho mã của bạn easiler để đọc ..

và nó bằng cách nào đó giống như phong cách corountine: bạn không chặn cuộc gọi và cũng không sử dụng chuỗi các callbacks để xây dựng toàn bộ logic. Nó là trực quan.

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