2013-06-12 35 views
6

Tôi bắt đầu học Scala và lập trình chức năng. Lập trình scala: Giải quyết đa lõi phức tạp trên máy ảo Java ".Trong chương đầu tiên tôi đã thấy từ Event-Driven concurrency và Actor model. Trước khi tôi tiếp tục đọc cuốn sách này, tôi muốn có một ý tưởng về đồng thời tổ chức sự kiện theo hướng hoặc diễn viên mẫu.Sự kiện đồng thời dựa trên sự kiện là gì?

đồng thời tổ chức sự kiện theo hướng là gì, và làm thế nào là nó liên quan đến diễn viên model?

+2

-1. Bạn đã làm gì/đọc cho đến nay để có được một ý tưởng về Event Concen Concurrency là gì? Google ít nhất cũng có thể giúp bạn với điều đó. Ba lần truy cập đầu tiên cho tôi là: http://berb.github.io/diploma-thesis/original/055_events.html, https://www.youtube.com/watch?v=2gcrTsQ7yi4, https: // vi. wikipedia.org/wiki/Event-driven_programming. –

Trả lời

12

một Event Driven mô hình lập trình liên quan đến việc đăng ký mã để được chạy khi một đám cháy sự kiện cho Ví dụ: thay vì gọi phương thức trả về một số dữ liệu từ cơ sở dữ liệu:

val user = db.getUser(1) 
println(user.name) 

Y Thay vào đó, bạn có thể đăng ký gọi lại để chạy khi dữ liệu sẵn sàng:

db.getUser(1, u => println(u.name)) 

Trong ví dụ đầu tiên, không có sự tương tranh nào xảy ra; Chuỗi hiện tại sẽ chặn cho đến khi db.getUser(1) trả về dữ liệu từ cơ sở dữ liệu. Trong ví dụ thứ hai db.getUser sẽ trả về ngay lập tức và thực hiện mã tiếp theo trong chương trình. Song song với điều này, gọi lại u => println(u.name) sẽ được thực hiện tại một số điểm trong tương lai.

Một số người thích cách tiếp cận thứ hai vì nó không có nghĩa là các chủ đề bộ nhớ đói không cần thiết ngồi xung quanh chờ đợi cho I/O chậm để quay trở lại.

Mô hình diễn viên là một ví dụ về cách khái niệm Event-Driven có thể được sử dụng để giúp lập trình viên dễ dàng viết các chương trình đồng thời.

Từ cấp độ siêu cao, diễn viên là đối tượng xác định chuỗi xử lý tin nhắn điều khiển sự kiện được kích hoạt khi diễn viên nhận được tin nhắn. Trong Akka, mỗi trường hợp của một diễn viên là duy nhất Threaded, tuy nhiên khi nhiều người trong số các diễn viên được đặt lại với nhau họ tạo ra một hệ thống với đồng thời. Ví dụ: Actor A có thể gửi tin nhắn đến Actor BC song song. Nam diễn viên BC có thể kích hoạt tin nhắn quay lại Actor A. Nam diễn viên A sẽ có trình xử lý tin nhắn để nhận các tin nhắn này và hoạt động như mong muốn.

Để tìm hiểu thêm về mô hình diễn viên, tôi khuyên bạn nên đọc tài liệu về Akka. Đó là thực sự là cũng được viết: http://doc.akka.io/docs/akka/2.1.4/

Ngoài ra còn có nhiều tài liệu hay về web mà chúng tôi đã viết ở đây. http://berb.github.io/diploma-thesis/original/055_events.html

2

Câu trả lời của Theon cung cấp một cái nhìn tổng quan hiện đại. Tôi muốn thêm một số quan điểm lịch sử.

Tony Hoare và Robert Milner đều phát triển đại số toán học để phân tích các hệ thống đồng thời (Giao tiếp các quy trình tuần tự, CSP và giao tiếp đồng thời hệ thống, CCS). Cả hai đều giống như toán học nặng cho hầu hết chúng ta nhưng ứng dụng thực tế là tương đối đơn giản. CSP dẫn trực tiếp đến ngôn ngữ lập trình Occam trong số những người khác, với Go là ví dụ mới nhất. CCS dẫn đến tính toán Pi và tính di động của kênh giao tiếp kết thúc, một tính năng là một phần của Go và được thêm vào Occam trong thập kỷ qua.

Mô hình CSP đồng thời hoàn toàn bằng cách xem xét các thực thể tự động ('quy trình', v.những thứ nhẹ như chủ đề màu xanh lá cây) tương tác đơn giản bằng trao đổi sự kiện. Phương tiện truyền sự kiện là dọc theo kênh. Các quá trình có thể phải xử lý một số đầu vào hoặc đầu ra và chúng thực hiện điều này bằng cách chọn sự kiện đã sẵn sàng đầu tiên. Các sự kiện thường mang dữ liệu từ người gửi đến người nhận. Một tính năng nguyên tắc của mô hình CSP là một cặp quy trình tham gia vào giao tiếp chỉ khi cả hai đều sẵn sàng - trong điều kiện thực tế, điều này dẫn đến cái được gọi là truyền thông 'đồng bộ'. Tuy nhiên, việc triển khai thực tế (Go, Occam, Akka) cho phép các kênh được đệm (trạng thái bình thường trong Akka) sao cho sự trao đổi các bước của sự kiện thường được tách ra để thay thế.

Vì vậy, tóm lại, một hệ thống dựa trên sự kiện dựa trên CSP thực sự là một mạng lưu lượng dữ liệu của các quá trình được kết nối bởi các kênh.

Bên cạnh việc diễn giải CSP theo hướng sự kiện, đã có những người khác. Một ví dụ quan trọng là cách tiếp cận 'event-wheel', một khi phổ biến để mô hình hóa các hệ thống đồng thời trong khi thực sự có một luồng xử lý đơn. Các hệ thống như vậy xử lý các sự kiện bằng cách đặt chúng vào một hàng đợi xử lý và xử lý chúng đúng hạn, thường là thông qua một cuộc gọi lại. Công cụ xử lý sự kiện của Java Swing là một ví dụ điển hình. Có những người khác, ví dụ: cho các công cụ mô phỏng dựa trên thời gian. Người ta cũng có thể nghĩ về mô hình Javascript/NodeJS như phù hợp với thể loại này.

Vì vậy, tóm lại, một sự kiện là một cách để thể hiện sự tương tranh nhưng không có sự song hành. Điều này trớ trêu là hai cách tiếp cận mà tôi đã mô tả ở trên đều được mô tả là sự kiện được định hướng nhưng ý nghĩa của chúng theo biến cố sự kiện là khác nhau trong mỗi trường hợp. Trong một trường hợp, các thực thể giống phần cứng được kết nối với nhau; trong khác, hầu như tất cả các hành động được thực hiện bởi callbacks. Cách tiếp cận CSP tuyên bố có thể mở rộng được vì nó hoàn toàn có thể tổng hợp được; đó là tự nhiên lão luyện tại thực hiện song song cũng có. Nếu có bất kỳ lý do để ủng hộ một trong những khác, đây có lẽ là nó.

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