Làm thế nào để nói rõ sự khác biệt giữa lập trình không đồng bộ và lập trình song song?


138

Nhiều nền tảng thúc đẩy sự không đồng bộ và song song là phương tiện để cải thiện khả năng đáp ứng. Tôi hiểu sự khác biệt nói chung, nhưng thường cảm thấy khó khăn để nói rõ trong tâm trí của tôi, cũng như cho người khác.

Tôi là một lập trình viên làm việc và sử dụng async & callbacks khá thường xuyên. Song song cảm thấy kỳ lạ.

Nhưng tôi cảm thấy như chúng dễ bị xáo trộn, đặc biệt là ở cấp độ thiết kế ngôn ngữ. Rất thích một mô tả rõ ràng về cách chúng liên quan (hoặc không) và các lớp chương trình nơi mỗi chương trình được áp dụng tốt nhất.


Tôi đã viết một bài đăng trên blog về mối quan hệ giữa lập trình không đồng bộ và lập trình song song - anat-async.blogspot.com/2018/08/ Kẻ
Alexei Kaigorodov


6
song song là khi mọi thứ xảy ra đồng thời. Sự bất thường là khi bạn không buồn đợi kết quả của một hành động tiếp tục. Bạn chỉ cần đi ngủ và một lúc nào đó sau đó kết quả sẽ đến, rung chuông, bạn thức dậy và tiếp tục từ đó. Việc thực thi không đồng bộ hoàn toàn có thể xảy ra ser seri chỉ trong một luồng. (đó là khá nhiều những gì javascript làm)
Thanasis Ioannidis

Câu trả lời:


87

Khi bạn chạy một cái gì đó không đồng bộ, điều đó có nghĩa là nó không bị chặn, bạn thực hiện nó mà không cần đợi nó hoàn thành và tiếp tục với những thứ khác. Song song có nghĩa là chạy nhiều thứ cùng một lúc, song song. Song song hoạt động tốt khi bạn có thể tách các nhiệm vụ thành các phần công việc độc lập.

Lấy ví dụ kết xuất khung hình của một hình ảnh động 3D. Để kết xuất hoạt hình mất nhiều thời gian vì vậy nếu bạn khởi chạy kết xuất đó từ bên trong phần mềm chỉnh sửa hoạt hình của mình, bạn sẽ đảm bảo rằng nó đang chạy không đồng bộ để nó không bị khóa UI và bạn có thể tiếp tục làm những việc khác. Bây giờ, mỗi khung hình của hoạt hình đó cũng có thể được coi là một nhiệm vụ riêng lẻ. Nếu chúng tôi có sẵn nhiều CPU / lõi hoặc nhiều máy, chúng tôi có thể kết xuất nhiều khung hình song song để tăng tốc khối lượng công việc chung.


Hãy để tôi xem nếu tôi nhận được điều này. Các tác vụ song song của việc hiển thị các khung khác nhau phải được trải đều trên nhiều CPU / lõi. Điều đó không liên quan gì đến thời gian hoàn thành nhiệm vụ, hoặc liệu nhiệm vụ đó có chặn thứ gì khác không. Nó chỉ có nghĩa là một loạt các CPU sẽ làm điều đó cùng nhau và làm cho kết quả có sẵn như thể nó chạy trên một CPU siêu nhanh. Đúng?

1
"Để kết xuất hoạt hình mất nhiều thời gian vì vậy nếu bạn khởi chạy kết xuất đó từ bên trong phần mềm chỉnh sửa hoạt hình của mình, bạn sẽ đảm bảo (...)". Gì?

Đối với phần hoạt hình 3D: Trước hết, bạn KHÔNG BAO GIỜ chạy chương trình đồ họa 3D với việc tạo khung trên CPU - bất kỳ người tỉnh táo nào cũng sẽ đề xuất ngay lập tức bằng cách sử dụng GPU. Thứ hai, nếu chúng ta làm điều này (rất nản lòng), chúng ta sẽ sử dụng bộ đếm thời gian để đo xem chúng ta có thể kết xuất bao nhiêu khung hình, nếu không, chúng ta có thể kết thúc việc xây dựng một đống các nhiệm vụ kết xuất chưa hoàn thành. Nhưng quan điểm của bạn là hoàn toàn hợp lệ với hầu hết các ứng dụng kết xuất 2D đang hiển thị trên cơ sở sự kiện đầu vào của mỗi người dùng.
ワ イ き

1
Không đồng bộ và không chặn là các mô hình khác nhau .
Hầu tước Lorne

72

Tôi tin rằng sự khác biệt chính là giữa đồng thờisong song .

AsyncCallbacks nói chung là một cách (công cụ hoặc cơ chế) để thể hiện đồng thời, tức là một tập hợp các thực thể có thể nói chuyện với nhau và chia sẻ tài nguyên. Trong trường hợp giao tiếp không đồng bộ hoặc gọi lại là ẩn trong khi chia sẻ tài nguyên là tùy chọn (xem xét RMI nơi kết quả được tính trong một máy từ xa). Như đã lưu ý chính xác, điều này thường được thực hiện với sự đáp ứng trong tâm trí; để không chờ đợi sự kiện độ trễ dài .

Lập trình song song thường có thông lượng là mục tiêu chính trong khi độ trễ, tức là thời gian hoàn thành cho một phần tử, có thể tệ hơn một chương trình tuần tự tương đương.

Để hiểu rõ hơn về sự khác biệt giữa đồng thời và song song, tôi sẽ trích dẫn từ các mô hình Xác suất cho sự tương tranh của Daniele Varacca, một bộ ghi chú tốt cho lý thuyết đồng thời:

Một mô hình tính toán là một mô hình cho sự tương tranh khi nó có thể biểu diễn các hệ thống bao gồm các thành phần tự trị độc lập, có thể giao tiếp với nhau. Không nên nhầm lẫn khái niệm đồng thời với khái niệm song song. Các tính toán song song thường liên quan đến một điều khiển trung tâm phân phối công việc giữa một số bộ xử lý. Đồng thời, chúng tôi nhấn mạnh tính độc lập của các thành phần và thực tế là chúng giao tiếp với nhau. Song song giống như Ai Cập cổ đại, nơi Pharaoh quyết định và nô lệ làm việc. Đồng thời giống như nước Ý hiện đại, nơi mọi người đều làm những gì họ muốn và tất cả đều sử dụng điện thoại di động.

Tóm lại , lập trình song song là một trường hợp đặc biệt của sự tương tranh trong đó các thực thể riêng biệt hợp tác để có được hiệu suất và thông lượng cao (nói chung).

Async và Callbacks chỉ là một cơ chế cho phép lập trình viên thể hiện đồng thời. Hãy xem xét rằng các mẫu thiết kế lập trình song song nổi tiếng như master / worker hoặc map / less được triển khai bởi các khung sử dụng các cơ chế cấp thấp hơn (async) để thực hiện các tương tác tập trung phức tạp hơn .


37

Bài viết này giải thích nó rất tốt: http://urda.cc/blog/2010/10/04/asynyncous-versus-abul-programming

Nó có điều này về lập trình không đồng bộ:

Các cuộc gọi không đồng bộ được sử dụng để ngăn chặn chặn chặn chặn trong một ứng dụng. Cuộc gọi [như vậy] sẽ tắt trong một luồng đã có sẵn (chẳng hạn như luồng I / O) và thực hiện nhiệm vụ của nó khi có thể.

Điều này về lập trình song song:

Trong lập trình song song, bạn vẫn chia nhỏ công việc hoặc nhiệm vụ, nhưng điểm khác biệt chính là bạn tạo ra các luồng mới cho mỗi khối công việc

và điều này tóm tắt:

Các cuộc gọi không đồng bộ sẽ sử dụng các luồng đã được sử dụng bởi hệ thốnglập trình song song yêu cầu nhà phát triển phá vỡ các công việc, spinup và xé các luồng cần thiết .


3
Bài viết này> tất cả các câu trả lời ở đây (ngoại trừ câu hỏi này tất nhiên!)
FellyTone84

1
Cảm ơn các liên kết. Vì vậy, ... nói chung , sử dụng các cuộc gọi không đồng bộ khi giao tiếp từ giao diện người dùng đến máy chủ (hoặc từ máy khách đến dịch vụ web). Sử dụng luồng song song trên máy chủ hoặc kết thúc dịch vụ web, cũng như trong lớp doanh nghiệp của bạn.
goku_da_master

18

Hiểu biết cơ bản của tôi là:

Lập trình Asynchonous giải quyết vấn đề chờ đợi một hoạt động đắt tiền hoàn thành trước khi bạn có thể làm bất cứ điều gì khác. Nếu bạn có thể hoàn thành công việc khác trong khi chờ hoạt động hoàn tất thì đó là một điều tốt. Ví dụ: giữ UI chạy trong khi bạn đi và lấy thêm dữ liệu từ dịch vụ web.

Lập trình song song có liên quan nhưng quan tâm nhiều hơn đến việc chia một nhiệm vụ lớn thành các phần nhỏ hơn có thể được tính toán cùng một lúc. Kết quả của các phần nhỏ hơn sau đó có thể được kết hợp để tạo ra kết quả tổng thể. Ví dụ: dò tia trong đó màu của từng pixel về cơ bản là độc lập.

Có lẽ nó phức tạp hơn thế, nhưng tôi nghĩ đó là điểm khác biệt cơ bản.


Điều này là độc đáo nhưng nó khá sai. Giống như tính không điển hình, tính song song cũng cho phép dòng điều khiển tiếp tục mà không phải chờ đợi hành động hoàn tất. Sự khác biệt chính là sự song song phụ thuộc vào phần cứng.
serkan

13

Tôi có xu hướng nghĩ về sự khác biệt trong các điều khoản này:

Không đồng bộ: Đi xa và thực hiện nhiệm vụ này, khi bạn hoàn thành, quay lại và nói với tôi và mang lại kết quả. Tôi sẽ tiếp tục với những thứ khác trong thời gian đó.

Song song: Tôi muốn bạn làm nhiệm vụ này. Nếu nó làm cho nó dễ dàng hơn, hãy nhờ một số người giúp đỡ. Điều này là khẩn cấp, vì vậy tôi sẽ đợi ở đây cho đến khi bạn quay lại với kết quả. Tôi không thể làm gì khác cho đến khi bạn trở lại.

Tất nhiên, một nhiệm vụ không đồng bộ có thể sử dụng song song, nhưng sự khác biệt - ít nhất là đối với tôi - là liệu bạn có tiếp tục với những thứ khác trong khi thao tác đang được thực hiện hay nếu bạn dừng mọi thứ hoàn toàn cho đến khi có kết quả.


13

async : Làm điều này bằng chính mình ở một nơi khác và thông báo cho tôi khi bạn hoàn thành (callback). Đến lúc tôi có thể tiếp tục làm việc của mình.

nhập mô tả hình ảnh ở đây

song song : Thuê nhiều người (chủ đề) như bạn muốn và phân chia công việc cho họ để hoàn thành nhanh hơn và cho tôi biết (gọi lại) khi bạn hoàn thành. Đến lúc tôi có thể tiếp tục làm những việc khác của mình.

nhập mô tả hình ảnh ở đây

sự khác biệt chính là song song chủ yếu phụ thuộc vào phần cứng.


11

Đó là một câu hỏi về thứ tự thực hiện.

Nếu A không đồng bộ với B, thì tôi không thể dự đoán trước khi các nhánh con của A sẽ xảy ra đối với các nhánh con của B.

Nếu A song song với B, thì những điều trong A đang xảy ra cùng lúc với những điều trong B. Tuy nhiên, một thứ tự thực hiện vẫn có thể được xác định.

Có lẽ khó khăn là từ không đồng bộ là không rõ ràng.

Tôi thực hiện một nhiệm vụ không đồng bộ khi tôi nói với quản gia của mình chạy đến cửa hàng để lấy thêm rượu và pho mát, sau đó quên anh ta và làm việc với cuốn tiểu thuyết của tôi cho đến khi anh ta gõ cửa nghiên cứu một lần nữa. Sự song song đang diễn ra ở đây, nhưng quản gia và tôi đang tham gia vào các nhiệm vụ cơ bản khác nhau và thuộc các tầng lớp xã hội khác nhau, vì vậy chúng tôi không áp dụng nhãn đó ở đây.

Đội ngũ người giúp việc của tôi đang làm việc song song khi mỗi người trong số họ đang giặt một cửa sổ khác nhau.

Nhóm hỗ trợ xe đua của tôi song song không đồng bộ ở chỗ mỗi đội làm việc trên một lốp xe khác nhau và họ không cần liên lạc với nhau hoặc quản lý các tài nguyên được chia sẻ trong khi họ thực hiện công việc của mình.

Đội bóng đá của tôi (hay còn gọi là bóng đá) hoạt động song song khi mỗi cầu thủ xử lý độc lập thông tin về sân và di chuyển trên đó, nhưng họ không hoàn toàn không đồng bộ vì họ phải giao tiếp và phản hồi thông tin liên lạc của người khác.

Ban nhạc diễu hành của tôi cũng song song khi mỗi người chơi đọc nhạc và điều khiển nhạc cụ của họ, nhưng họ rất đồng bộ: họ chơi và diễu hành kịp thời với nhau.

Một khẩu súng máy được ngụy trang có thể được coi là song song, nhưng mọi thứ đều đồng bộ 100%, vì vậy nó như thể một quá trình đang tiến về phía trước.


9

Tại sao không đồng bộ?

Với ứng dụng ngày nay ngày càng kết nối nhiều hơn và cũng có khả năng thực hiện các tác vụ hoặc hoạt động lâu dài như Mạng I / O hoặc Hoạt động cơ sở dữ liệu. Điều quan trọng là phải che giấu độ trễ của các hoạt động này bằng cách khởi động chúng ở chế độ nền và quay lại giao diện người dùng càng nhanh càng tốt Ở đây không đồng bộ đi vào hình ảnh, Phản hồi .

Tại sao phải lập trình song song?

Với bộ dữ liệu ngày nay ngày càng lớn và tính toán ngày càng phức tạp. Vì vậy, điều rất quan trọng là giảm thời gian thực hiện của các hoạt động gắn với CPU này, trong trường hợp này, bằng cách chia khối lượng công việc thành các khối và sau đó thực hiện đồng thời các khối đó. Chúng ta có thể gọi đây là "Song song". Rõ ràng nó sẽ mang lại hiệu suất cao cho ứng dụng của chúng tôi.


5

Không đồng bộ Giả sử bạn là điểm liên lạc cho khách hàng của mình và bạn cần phản hồi tức là bạn cần chia sẻ trạng thái, độ phức tạp của hoạt động, tài nguyên cần thiết, v.v. bất cứ khi nào được yêu cầu. Bây giờ bạn có một hoạt động tốn thời gian phải được thực hiện và do đó không thể thực hiện việc này vì bạn cần phải đáp ứng với khách hàng 24/7. Do đó, bạn ủy thác hoạt động tốn thời gian cho người khác để bạn có thể phản hồi. Điều này là không đồng bộ.

Lập trình song song Giả sử bạn có một nhiệm vụ để đọc, giả sử, 100 dòng từ tệp văn bản và đọc một dòng mất 1 giây. Do đó, bạn sẽ cần 100 giây để đọc tệp văn bản. Bây giờ bạn lo lắng rằng khách hàng phải đợi 100 giây để hoạt động kết thúc. Do đó, bạn tạo thêm 9 bản sao và làm cho mỗi người trong số họ đọc 10 dòng từ tệp văn bản. Bây giờ thời gian thực hiện chỉ là 10 giây để đọc 100 dòng. Do đó bạn có hiệu suất tốt hơn.

Tóm lại, mã hóa không đồng bộ được thực hiện để đạt được khả năng đáp ứng và lập trình song song được thực hiện để thực hiện.


4

Không đồng bộ: Chạy một phương thức hoặc tác vụ trong nền, mà không chặn. Có thể không nhất thiết phải chạy trên một chủ đề riêng biệt. Sử dụng chuyển đổi bối cảnh / lập lịch thời gian.

Nhiệm vụ song song: Mỗi nhiệm vụ chạy song song. Không sử dụng chuyển đổi ngữ cảnh / lập lịch thời gian.


4

Tôi đến đây khá thoải mái với hai khái niệm, nhưng với một cái gì đó không rõ ràng với tôi về chúng.

Sau khi đọc qua một số câu trả lời, tôi nghĩ rằng tôi có một phép ẩn dụ chính xác và hữu ích để mô tả sự khác biệt.

Nếu bạn nghĩ các dòng mã riêng lẻ của mình là các thẻ chơi riêng biệt nhưng đã ra lệnh cho tôi (hãy dừng lại nếu tôi đang giải thích cách các thẻ đục lỗ của trường cũ hoạt động), thì với mỗi quy trình riêng biệt được viết, bạn sẽ có một chồng thẻ duy nhất (không sao chép và dán!) và sự khác biệt giữa những gì thường xảy ra khi chạy mã bình thường và không đồng bộ phụ thuộc vào việc bạn có quan tâm hay không.

Khi bạn chạy mã, bạn trao cho HĐH một tập hợp các thao tác đơn (trình biên dịch hoặc trình thông dịch của bạn đã phá mã cấp "cao hơn" của bạn) để chuyển cho bộ xử lý. Với một bộ xử lý, chỉ một dòng mã có thể được thực thi bất kỳ lúc nào. Vì vậy, để thực hiện ảo giác chạy nhiều tiến trình cùng một lúc, HĐH sử dụng một kỹ thuật trong đó nó chỉ gửi cho bộ xử lý một vài dòng từ một quy trình nhất định, chuyển đổi giữa tất cả các quy trình theo cách nó nhìn thấy Phù hợp. Kết quả là nhiều quá trình hiển thị tiến trình cho người dùng cuối tại thời điểm dường như cùng một lúc.

Đối với phép ẩn dụ của chúng tôi, mối quan hệ là HĐH luôn xáo trộn các thẻ trước khi gửi chúng đến bộ xử lý. Nếu ngăn xếp thẻ của bạn không phụ thuộc vào ngăn xếp khác, bạn không nhận thấy rằng ngăn xếp của mình đã ngừng được chọn trong khi ngăn xếp khác bắt đầu hoạt động. Vì vậy, nếu bạn không quan tâm, nó không thành vấn đề.

Tuy nhiên, nếu bạn quan tâm (ví dụ: có nhiều quy trình - hoặc ngăn xếp thẻ - phụ thuộc vào nhau), thì việc xáo trộn của HĐH sẽ làm hỏng kết quả của bạn.

Viết mã không đồng bộ đòi hỏi phải xử lý các phụ thuộc giữa thứ tự thực hiện bất kể thứ tự đó kết thúc như thế nào. Đây là lý do tại sao các cấu trúc như "gọi lại" được sử dụng. Họ nói với bộ xử lý, "việc tiếp theo cần làm là nói với chồng khác những gì chúng ta đã làm". Bằng cách sử dụng các công cụ như vậy, bạn có thể yên tâm rằng ngăn xếp khác sẽ được thông báo trước khi nó cho phép HĐH chạy bất kỳ hướng dẫn nào nữa. ("Nếu được gọi là_back == false: send (no_operation)" - không chắc đây có thực sự là cách nó được thực hiện hay không, nhưng về mặt logic, tôi nghĩ nó phù hợp.)

Đối với các quy trình song song, sự khác biệt là bạn có hai ngăn xếp không quan tâm đến nhau và hai công nhân để xử lý chúng. Vào cuối ngày, bạn có thể cần kết hợp các kết quả từ hai ngăn xếp, sau đó sẽ là vấn đề đồng bộ nhưng, để thực hiện, bạn không quan tâm nữa.

Không chắc chắn nếu điều này giúp nhưng tôi luôn tìm thấy nhiều lời giải thích hữu ích. Ngoài ra, lưu ý rằng việc thực thi không đồng bộ không bị hạn chế đối với một máy tính riêng lẻ và bộ xử lý của nó. Nói chung, nó liên quan đến thời gian, hoặc (thậm chí nói chung hơn) một thứ tự các sự kiện. Vì vậy, nếu bạn gửi ngăn xếp phụ thuộc A đến nút mạng X và ngăn xếp B được ghép nối của nó đến Y, mã không đồng bộ chính xác sẽ có thể giải thích cho tình huống như thể nó đang chạy cục bộ trên máy tính xách tay của bạn.


2

Nói chung, chỉ có hai cách bạn có thể làm nhiều hơn một việc mỗi lần. Một cái là không đồng bộ , cái kia là song song .

Từ cấp độ cao, như máy chủ phổ biến NGINX và thư viện Python nổi tiếng Tornado , cả hai đều sử dụng đầy đủ mô hình không đồng bộ là máy chủ luồng đơn có thể phục vụ đồng thời hàng ngàn máy khách (một số IOloopgọi lại ). Sử dụng ECF (kiểm soát ngoại lệ theo sau) có thể thực hiện mô hình lập trình không đồng bộ. vì vậy đôi khi không đồng bộ thực sự không thực hiện đồng thời, nhưng một số công việc bị ràng buộc io, không đồng bộ thực sự có thể thúc đẩy hiệu suất.

Các song song mô hình luôn đề cập đa luồng và đa xử lý. Điều này hoàn toàn có thể sử dụng bộ xử lý đa lõi, làm mọi thứ thực sự đồng thời.


-1

Tóm tắt tất cả các câu trả lời trên

  1. tính toán song song:

▪ giải quyết vấn đề thông lượng. Quan tâm đến việc phá vỡ một nhiệm vụ lớn thành khối nhỏ hơn

▪ liên quan đến máy (cần nhiều máy / lõi / cpu / bộ xử lý), ví dụ: nô lệ chủ, giảm bản đồ.

Tính toán song song thường liên quan đến một điều khiển trung tâm phân phối công việc giữa một số bộ xử lý

  1. không đồng bộ:

▪ giải quyết vấn đề về độ trễ, tức là vấn đề 'chờ đợi' để hoàn thành một hoạt động đắt tiền trước khi bạn có thể làm bất cứ điều gì khác

▪ là liên quan đến chủ đề (cần nhiều chủ đề)

Phân luồng (sử dụng Thread, Runnable, Executor) là một cách cơ bản để thực hiện các hoạt động không đồng bộ trong Java

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.