2009-12-18 67 views
7

Trong 1 năm qua tôi đã làm việc trên Java và flex. Trong khi mã hóa flex, hầu hết các phần mã của tôi đã đi cho một quăng kể từ khi nó không đồng bộ. Nó làm cho tôi suy nghĩ về những lợi thế và bất lợi thực sự của các ngôn ngữ thực thi đồng bộ so với các thực thi không đồng bộ.Ngôn ngữ đồng bộ và không đồng bộ

Các khu vực mà chúng mạnh hơn so với các khu vực khác và khu vực họ rơi là gì?

+6

Ngôn ngữ có thể không đồng bộ như thế nào? –

+0

@NSD - ý của ông là flex không bao giờ chặn - tất cả các hoạt động có thể chặn trên các nền tảng khác được triển khai một cách đồng bộ. – Grokys

+3

Bạn có định nghĩa về "ngôn ngữ thực thi đồng bộ" không? Hay bạn chỉ đơn giản là giải thích bản chất của sự kiện theo định hướng của Flex (cũng được tìm thấy trong hầu hết các GUI API khác, bao gồm cả Java) là "không đồng bộ"? – kdgregory

Trả lời

6

Tôi đã dành hầu hết năm mã hóa năm ngoái trong Silverlight, điều đó có nghĩa là tôi đã dành rất nhiều thời gian suy nghĩ (và chiến đấu cùng) cùng các vấn đề bạn mô tả.

Tóm lại, như những người khác đã chỉ ra, sức mạnh thực sự đối với mô hình không đồng bộ là khả năng tạo ra các hệ thống mạnh mẽ tương thích tốt với thế giới thực. Không ai thực sự có thể sử dụng ứng dụng Silverlight (hoặc Flash) nếu chuỗi giao diện người dùng bị tạm dừng mỗi lần mất một vài giây để cuộc gọi dịch vụ web trở lại.

Nhược điểm lớn nhất là mã kết quả là phức tạp và khó khắc phục. Những thứ như xử lý lỗi là một PITA, nhưng những thứ khó chịu nhất mà tôi phải đối phó là điều phối các phản hồi từ nhiều cuộc gọi không đồng bộ. Nếu bạn cần thông tin từ cuộc gọi A trước khi thực hiện cuộc gọi B và bạn cần thông tin từ cuộc gọi B trước khi thực hiện cuộc gọi C (và vv), mã kết quả trông thực sự khó chịu và dễ bị tất cả các loại tác dụng phụ lạ . Có những kỹ thuật để làm cho tất cả các công cụ này hoạt động, và thậm chí hợp lý sạch sẽ, nhưng nếu bạn đến từ thế giới đồng bộ (như tôi), đó là một đường cong học tập quan trọng. (Và nó không giúp Microsoft đẩy các sự kiện như là cách để đối phó với các cuộc gọi WCF khi gọi lại, theo ý kiến ​​của tôi, là sạch hơn và ít nhạy cảm với các loại tác dụng phụ lạ mà tôi đã nói đến.)

(Và vâng, folks khác là chính xác khi nói rằng nó không phải là ngôn ngữ đó là không đồng bộ rất nhiều như các khuôn khổ đặc biệt đòi hỏi phải xây dựng mã của bạn một cách không đồng bộ -. Nhưng tôi có được những gì bạn có ý nghĩa)

Cập nhật 2014.09.23 -

Tôi đã thực hiện nhiều công việc hơn với nhiều khung công tác không đồng bộ kể từ khi tôi viết câu trả lời ở trên (có lẽ mọi người đã thực hiện bất kỳ mã hóa web nào) và nghĩ rằng tôi sẽ thêm một vài ghi chú ngẫu nhiên bổ sung:

  • Nếu bạn đang sử dụng một ngôn ngữ như C# hoặc F # có hỗ trợ không đồng bộ hạng nhất, rất nhiều điều này sẽ dễ dàng hơn rất nhiều, ít nhất, khi bạn quấn đầu quanh các mẫu async/await kỳ lạ. Có thể lặp lại dễ dàng xung quanh các cuộc gọi không đồng bộ, và quấn toàn bộ điều với một đơn giản try/catch, là tuyệt vời nếu bạn đã từng phải làm điều đó theo cách cũ.

  • Nếu bạn không sử dụng một ngôn ngữ với sự hỗ trợ async hạng nhất, bắt đầu sử dụng bất cứ điều gì promise hoặc future hoặc task hỗ trợ mà ngôn ngữ không cung cấp (ví dụ, JQuery $.Deferred(), hoặc góc của $q.defer(). Đó là rất nhiều bụi và cung cấp cấu trúc tốt hơn so với những gì bạn thường nhận được với các cuộc gọi lại

  • Mã không đồng bộ là rất quan trọng để viết các hệ thống phía máy chủ có thể mở rộng được. ít nhất, nó sẽ làm gì nếu nó dành một sợi chỉ để đạt được yêu cầu đến. chạy cuộc gọi đồng bộ để hoàn thành, nó hoàn toàn không có sẵn để giúp đỡ với bất cứ điều gì khác. Tốt hơn hết là làm cho mã máy chủ web của bạn không đồng bộ, để khi bạn đang chờ một cuộc gọi DB quay lại, luồng đó có thể đi dịch vụ nửa tá yêu cầu khác trong khi DB đang làm và làm bất cứ điều gì DB làm. Tại thời điểm này, đối với các hệ thống có khả năng mở rộng cao, async là trò chơi duy nhất trong thị trấn. (Chỉ cần hỏi bất kỳ người hâm mộ Node nào.)

+0

Có cách nào để viết các ứng dụng trong khung điều khiển sự kiện không? – Umesh

+0

Hãy chỉ nói rằng biểu thức lambda là người bạn tốt nhất mới của bạn :-). Bên cạnh đó, tôi nghĩ rằng các mô hình và thực hành sẽ phần lớn thay đổi từ khuôn khổ đến khuôn khổ, tùy thuộc vào các ràng buộc mà họ đặt vào bạn. Ví dụ, trong thế giới Silverlight, tôi đã thấy rằng nó sẽ giúp đỡ đáng kể để bọc mẫu theo hướng sự kiện mà Microsoft cung cấp với một mẫu gọi lại (và tôi thường thực hiện gọi lại như là một biểu thức lambda). Điều này làm cho việc theo dõi logic ứng dụng trở nên dễ dàng hơn nhiều. Tôi đã không làm đủ Flex để biết những gì thích hợp ở đó. –

3

(Gác lại những cuộc thảo luận mức độ ngữ nghĩa có nghĩa là "đồng bộ hóa/ngôn ngữ async")

A "khủng" được xây dựng trên một "ngôn ngữ" (bất cứ điều gì) nên có thể xử lý những trường hợp này (đồng bộ chương trình/async dòng chảy) để có ích (đọc: $ khôn ngoan).

Thành ngữ không đồng bộ phù hợp ở mọi quy mô.

Ở quy mô lớn, các kỹ thuật không đồng bộ giúp xây dựng các hệ thống đáng tin cậy vì thế giới thực là bất kỳ cách nào không đồng bộ trong tự nhiên. Nói cách khác, người ta cần phải suy nghĩ trong "những suy nghĩ không đồng bộ" để đối phó với các tình huống thực tế chẳng hạn như thất bại, mất mát, sự chậm trễ, v.v.

Ngay cả trên quy mô nhỏ hơn (ví dụ như ứng dụng GUI), sự kiện (chẳng hạn như "chuột" nhấp chuột ") có xu hướng" không đồng bộ ". Tất nhiên chúng được "tuần tự hóa" tại một thời điểm nào đó (để có thể xử lý được bằng một ứng dụng chạy một số phần mềm) nhưng nó không thay đổi thực tế rằng các sự kiện (có thể) xảy ra "không đồng bộ" liên quan đến luồng của chương trình câu hỏi.

+0

Đúng nếu bạn nghĩ nhiều trường hợp thử nghiệm song song. Nhưng theo như tôi có thể nghĩ, họ sẽ chỉ giúp đỡ cho các trường hợp thử nghiệm. Trong cuộc sống thực và tất cả "những gì tiếp theo" là hoàn toàn phụ thuộc vào "những gì đang xảy ra bây giờ" hoặc kết quả của điều đó. Vậy làm thế nào có thể không đồng bộ trở thành một thành tựu? – Umesh

+1

@Umesh: "những gì đang xảy ra bây giờ" là một "sandbox" được tạo ra bởi các sự kiện "serialization" nhân tạo. Đó là một câu hỏi của "khung tham chiếu" (như chúng ta gọi nó là vật lý).Đối với "làm thế nào có thể được không đồng bộ trở thành một thành tích", tôi phải nói rằng tôi không theo bạn. Bạn vui lòng quan tâm để giải thích? – jldupont

+0

Giải thích của bạn đã làm cho tôi rõ ràng. Hãy quên câu hỏi của tôi. Cảm ơn – Umesh

1

Tôi nghĩ nó không phải về ngôn ngữ, mà là về khuôn khổ.

Counter-trường hợp tại điểm:

Khi viết 'Classic Mac' (MacOS 9 và trước đó) ứng dụng trong C (một ngôn ngữ 'đồng bộ' nếu có bao giờ là một), bạn không cần phải đa luồng ưu tiên, vì vậy tất cả các cuộc gọi hệ thống có khả năng chặn có một đối tác không đồng bộ, nơi bạn điền vào một khối dữ liệu với các tham số bao gồm cả chức năng gọi lại. Sau đó, bạn thực hiện cuộc gọi hệ thống (mà sẽ trở lại ngay lập tức), và gọi lại của bạn sẽ được gọi là không đồng bộ (trong cái gọi là 'mức ngắt'). Nó không phải là không phổ biến mà một cuộc gọi lại sẽ làm một cuộc gọi hệ thống không đồng bộ, tạo ra một sợi nền dài chạy không đồng bộ với một chính.

+0

Có thực sự có nghĩa là cải thiện hiệu suất bằng cách chạy song song và sử dụng phần cứng . Nhưng chi phí nghe lời gọi lại từ chuỗi chủ đề là gì. Họ có mặt tốt hơn không? – Umesh

+0

@Umesh: Bạn không nghe lời gọi lại từ chuỗi khác, chuỗi gọi trực tiếp lại. Chi phí là giống như bất kỳ cuộc gọi chức năng nào khác. – tloach

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