2009-08-23 44 views
26

Trong Parallel Python, có một số nội dung trong hàm gửi được gọi là gọi lại (documentation) tuy nhiên dường như không giải thích rõ ràng. Tôi đã đăng trên diễn đàn của họ một vài ngày trước và tôi đã không nhận được phản hồi. Có ai đó sẽ giải thích những gì một cuộc gọi lại và những gì nó được sử dụng cho?Python song song: Gọi lại là gì?

Cảm ơn bạn.

Trả lời

104

Gọi lại là một chức năng được cung cấp bởi người tiêu dùng API mà API có thể quay lại và gọi (gọi lại cho bạn). Nếu tôi thiết lập một cuộc hẹn của Tiến sĩ, tôi có thể cung cấp cho họ số điện thoại của tôi, để họ có thể gọi cho tôi vào ngày hôm trước để xác nhận cuộc hẹn. Một cuộc gọi lại là như vậy, ngoại trừ thay vì chỉ là một số điện thoại, nó có thể là hướng dẫn tùy ý như "gửi cho tôi một email tại địa chỉ này, và cũng có thể gọi cho thư ký của tôi và đặt nó vào trong lịch của tôi"

Callbacks are Nếu bạn cần gọi một hàm, và ngay lập tức tiếp tục làm việc, bạn không thể ngồi đó chờ đợi giá trị trả lại của nó để cho bạn biết những gì đã xảy ra, vì vậy bạn cung cấp một cuộc gọi lại. được thực hiện hoàn toàn công việc không đồng bộ của nó sau đó nó sẽ gọi lại cuộc gọi của bạn với một số đối số được xác định trước (thường là một số bạn cung cấp, và một số về trạng thái và kết quả của hành động không đồng bộ mà bạn yêu cầu)

Nếu bác sĩ ở ngoài văn phòng hoặc họ vẫn đang làm việc theo lịch, thay vì để tôi chờ đợi cho đến khi anh ta trở lại, có thể là vài giờ, chúng tôi gác máy, và một khi cuộc hẹn đã được lên lịch, họ gọi cho tôi.

Trong trường hợp cụ thể này, hàm gửi song song của Python sẽ gọi hàm gọi lại của bạn với bất kỳ đối số nào bạn cung cấp và kết quả của func, sau khi func hoàn thành việc thực thi.

+5

Điều này nhận được một ưu tiên lớn từ tôi (vẫn chỉ đáng giá như bất kỳ upvote khác) cho một tương tự rất dễ hiểu mà có lẽ sẽ hữu ích cho người mới bắt đầu –

+1

Đây là một lời giải thích rất tốt cho người mới bắt đầu, nó chỉ thiếu một điều - một mã mẫu. Bây giờ người mới bắt đầu biết nó là gì, bạn có thể cho chúng tôi một ví dụ đơn giản về nó sẽ trông như thế nào sử dụng analog của bạn như tên hàm ea: 'callDoctor() callPatientBack()' etc –

3

Nhìn vào liên kết, trông giống như móc được gọi.

callback - hàm callback mà sẽ được gọi với lập luận danh sách bằng callbackargs + (kết quả,) càng sớm càng tính toán được thực hiện

Các "càng sớm càng tính toán được thực hiện" chút dường như mơ hồ. Điểm, theo như tôi có thể thấy điều này là cuộc gọi submit() phân phối công việc cho các máy chủ khác và sau đó trả về. Bởi vì kết thúc là không đồng bộ, thay vì khối, nó cho phép bạn cung cấp một hàm được gọi khi một số đơn vị công việc kết thúc. Nếu bạn thực hiện:

submit(..., callback=work_finished, ...) 

Sau đó, gửi sẽ đảm bảo work_finished() được gọi khi đơn vị phân phối hoàn thành trên máy chủ đích.

Khi bạn gọi submit() bạn có thể cung cấp một callback được gọi trong thời gian chạy giống như người gọi của submit() ... và nó được gọi sau khi phân phối của hàm khối lượng công việc hoàn tất.

Giống như "foo gọi (x, y) khi bạn đã thực hiện một số nội dung trong trình()"

Nhưng yea, các tài liệu có thể được tốt hơn. Có một ganders tại nguồn ppython và xem tại thời điểm đó gọi lại được gọi trong submit()

14

Các vị trí có liên quan trong các tài liệu:

callback - callback function which will be called with argument 
     list equal to callbackargs+(result,) 
     as soon as calculation is done 
callbackargs - additional arguments for callback function 

Vì vậy, nếu bạn muốn có một số mã được thực hiện ngay sau khi kết quả đã sẵn sàng, bạn đặt mã đó vào một hàm và chuyển hàm đó làm đối số callback. Nếu bạn không cần phải tranh luận khác, nó sẽ chỉ là, ví dụ .:

def itsdone(result): 
    print "Done! result=%r" % (result,) 
... 
submit(..., callback=itsdone) 

Để biết thêm về mô hình callback bằng Python, xem ví dụ bản trình bày của tôi here.

+1

Bạn không có nghĩa là "vào thời điểm" thay vì "dài"? – Dykam

+0

Tôi có nghĩa là "ngay sau khi", giống như tài liệu tôi đã trích dẫn - hãy để tôi chỉnh sửa để khắc phục, cảm ơn! –

+5

tiếc là các liên kết của bạn không hoạt động: ( – bluish

1

Gọi lại chỉ đơn giản là một chức năng. Trong Python, chức năng chỉ là nhiều đối tượng, và do đó tên của một hàm có thể được sử dụng như là một biến, như vậy:

def func(): 
    ... 

something(func) 

Lưu ý rằng nhiều chức năng mà chấp nhận một cuộc gọi lại như một cuộc tranh cãi thường yêu cầu gọi lại chấp nhận các đối số nhất định. Trong trường hợp này, hàm gọi lại sẽ cần phải chấp nhận một danh sách các đối số được chỉ định trong callbackargs. Tôi không quen thuộc với song song Python vì vậy tôi không biết chính xác những gì nó muốn.

3

A callback là một hàm bạn xác định sau đó được gọi bằng hàm mà bạn gọi.

Ví dụ, hãy xem xét cách AJAX hoạt động: bạn viết mã gọi một hàm máy chủ back-end. Tại một thời điểm nào đó trong tương lai, nó trả về từ hàm đó (chữ "A" là viết tắt của Asynchronous, đó là những gì "Parallel" trong "Parallel Python" là tất cả). Bây giờ - bởi vì mã của bạn gọi mã trên máy chủ, bạn muốn nó cho bạn biết khi nào nó được thực hiện, và bạn muốn làm điều gì đó với kết quả của nó. Làm như vậy bằng cách gọi hàm gọi lại của bạn.

Khi hàm được gọi hoàn tất, cách tiêu chuẩn để nó cho bạn biết nó được thực hiện là để bạn nói với nó để gọi một hàm trong mã của bạn. Đó là hàm gọi lại, và công việc của nó là xử lý các kết quả/đầu ra từ hàm mức thấp hơn mà bạn đã gọi.

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