Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong javascript

Lập trình không đồng bộ là một dạng lập trình song song cho phép một đơn vị công việc chạy tách biệt với luồng ứng dụng chính. Khi công việc hoàn thành, nó sẽ thông báo cho luồng chính (cũng như công việc đã hoàn thành hay thất bại). Có rất nhiều lợi ích khi sử dụng nó, chẳng hạn như hiệu suất ứng dụng được cải thiện và khả năng phản hồi nâng cao

Tuy nhiên, giống như mọi thứ trong lập trình, nó không phải là thứ mà bạn nên sử dụng trong mọi trường hợp; . Lập trình bất đồng bộ thực ra đã có từ rất lâu nhưng những năm gần đây nó mới được sử dụng rộng rãi hơn. Theo Mike James tại iProgrammer, “Thường thì lập trình viên nhận thức đầy đủ rằng những gì họ đang làm là hướng đối tượng nhưng chỉ nhận thức mơ hồ rằng họ đang viết mã không đồng bộ. ” Vì vậy, chúng tôi bắt đầu xác định các trường hợp sử dụng tốt nhất cho async cũng như các tình huống mà bạn không nên sử dụng nó. Chúng tôi đã tìm kiếm thông tin chi tiết trên web và liên hệ với một nhóm lập trình viên và yêu cầu họ trả lời câu hỏi này


Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong javascript
Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong javascript

“Một số ví dụ về các tình huống mà các lập trình viên sử dụng lập trình không đồng bộ nhưng không nên (hoặc những lĩnh vực mà họ không nên nhưng có lẽ nên)?”

Gặp gỡ nhóm chuyên gia lập trình của chúng tôi

Tìm hiểu thêm về các trường hợp sử dụng lý tưởng cho lập trình không đồng bộ bằng cách đọc những gì các chuyên gia của chúng tôi đã nói bên dưới


James McCarthy

James là một doanh nhân web nối tiếp, người đã xây dựng các trang web với mục đích giúp đỡ hàng triệu người. Trong 2 năm qua, anh ấy đã tạo Danh mục MRI, Tạo Tóm tắt và Biểu đồ Tai nghe

“Mọi tình huống đều khác nhau và không có giải pháp túi xách thực sự nào…”

Theo nguyên tắc thông thường, cập nhật không đồng bộ các bản ghi phụ thuộc hoặc phụ thuộc vào nói chung là một ý tưởng tồi. Đó là một cách nhanh chóng để dữ liệu của bạn không đồng bộ. Xử lý đơn giản dữ liệu độc lập là một nơi tuyệt vời để lập trình không đồng bộ và cung cấp UX tốt hơn và hầu hết thời gian, hiệu suất tốt hơn trong ứng dụng của bạn


Calvin Nâu

@iamcalvinbrown

Calvin Brown là người sáng lập Kairu Consulting

“Lập trình viên thường sử dụng async quá nhiều…”

Trong các ứng dụng dành cho thiết bị di động để ngăn màn hình bị đóng băng và tạo cho khách hàng ấn tượng rằng quy trình đang thực hiện các hành động một cách trực quan, nhưng thực tế thường không phải vậy. Nói theo nghĩa đen, khi một ứng dụng yêu cầu dữ liệu (từ cơ sở dữ liệu, dịch vụ web, v.v. ), nó phải đợi cho đến khi dịch vụ đó trả lời. Tất cả các cử chỉ ưa thích thường có trong các ứng dụng xảy ra do các cuộc gọi không đồng bộ đến các dịch vụ cùng lúc với việc giải trí cho người dùng bằng một số logo hoặc tin nhắn. Lượng tài nguyên được sử dụng tại thời điểm này cao hơn nhiều so với mức sử dụng ứng dụng thông thường và cuối cùng, với rất nhiều lần làm mới, bộ nhớ của người dùng sẽ bị ảnh hưởng

Có các cách giải quyết và không đồng bộ là cần thiết trong các trường hợp như tải trước dữ liệu khi ứng dụng bắt đầu lần đầu tiên. Tuy nhiên, trong các trường hợp khác, việc sử dụng async quá nhiều là sáo rỗng và thường gây hại cho thiết bị của người dùng


Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong javascript
Kevin Ng

@wildebeest_dev

Kevin Ng là Trưởng nhóm công nghệ tại Wildebeest

“Lập trình bất đồng bộ và lập trình song song có lợi ích rất lớn…”

Nhưng đôi khi có thể bị lạm dụng quá mức. Một trường hợp mà tôi cảm thấy các lập trình viên có thể sử dụng async quá mức là đối với các tính toán đơn giản và cơ bản. Không có lợi ích thực sự nào về hiệu suất khi sử dụng tính năng không đồng bộ cho các tính toán này

Ngoài ra, một tình huống khác mà tính năng không đồng bộ có thể không hữu ích là khi bạn có một máy chủ cơ sở dữ liệu duy nhất không sử dụng tính năng tổng hợp kết nối. Nếu tất cả yêu cầu truy cập vào cùng một cơ sở dữ liệu bằng cách sử dụng một kết nối đang hoạt động lâu dài, điều đó sẽ không tạo ra sự khác biệt nếu các lệnh gọi không đồng bộ hoặc đồng bộ. Nút cổ chai của bạn sẽ là máy chủ cơ sở dữ liệu


Lindsey Haven

@PhishLabs

Lindsey Havens là Giám đốc tiếp thị cấp cao của PhishLabs

“Về cơ bản, bạn có thể sử dụng Lập trình không đồng bộ trừ khi các điều kiện sau là đúng…”

  • Bạn hướng đến sự đơn giản hơn là hiệu quả
  • Bạn đang muốn chạy các hoạt động đơn giản hoặc chạy ngắn

Lập trình không đồng bộ sẽ không mang lại lợi ích và thực tế sẽ dẫn đến nhiều chi phí hoạt động hơn đối với các hoạt động chủ yếu là hoạt động của CPU thay vì những hoạt động liên quan đến mạng hoặc chi phí ổ đĩa


Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong javascript
Manu Singh

@ClrMobile

Manu Singh là Kiến trúc sư di động tại Clearbridge Mobile với kinh nghiệm về Thiết kế, phát triển và thử nghiệm Android. Tại Clearbridge, Manu quản lý tài nguyên dự án cho một nhóm các nhà phát triển xây dựng ứng dụng đẳng cấp thế giới cho khách hàng doanh nghiệp

“Nếu có một tài nguyên được sử dụng bởi các phần tử khác nhau hoặc một luồng đơn lẻ trong một ứng dụng chịu trách nhiệm về một tài nguyên hoặc chức năng…”

Nó cần phải được đồng bộ hóa. Ví dụ: trên Android, có một luồng giao diện người dùng chính chịu trách nhiệm hiển thị giao diện người dùng cho ứng dụng. Có quá nhiều lệnh gọi không đồng bộ ảnh hưởng đến giao diện người dùng có thể gây ra sự cố và có thể làm mọi thứ chậm lại. Trong trường hợp luồng chính của giao diện người dùng này, bạn sẽ muốn có một số tính đồng bộ để giao diện người dùng được hiển thị chính xác, không có xung đột với những gì được hiển thị và quần thể giao diện người dùng được thực hiện theo đúng trình tự


Steve Silberberg

@fitpacking

Steve là người sáng lập Fitpacking, một doanh nghiệp nhỏ đưa mọi người vào các kỳ nghỉ phiêu lưu bằng ba lô để lấy lại vóc dáng cân đối và giảm béo

“Nếu bạn lập trình các ứng dụng Android bằng MIT App Inventor 2…”

Bạn có thể bị buộc phải lập trình không đồng bộ mặc dù bạn không muốn. Ví dụ. Tôi đã lập trình một ứng dụng truy vấn Google Fusion Tables khi tải chương trình. Tuy nhiên, App Inventor 2 vẫn tiếp tục thực thi các khối khác mặc dù kết quả của truy vấn Fusion Table chưa trả về. Do đó, bạn không nên đặt các khối mã tiếp theo này phụ thuộc vào kết quả truy vấn, nếu không bạn sẽ gặp lỗi. Đây là một trường hợp mà một lập trình viên sử dụng lập trình không đồng bộ khi họ thực sự không nên


Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong javascript
Max Galka

@galka_max

Max Galka là một doanh nhân và nhà phát triển web có trụ sở tại Thành phố New York. Anh là người sáng lập nền tảng lập bản đồ Blueshift và là giảng viên trợ giảng tại Đại học Pennsylvania

“Khi chuyển đổi từ JavaScript giao diện người dùng sang phát triển back-end với Node…”

Bài học đầu tiên bạn học là làm cho các vòng lặp của bạn không đồng bộ để tránh chặn vòng lặp sự kiện. Nhưng tôi thường thấy mọi người đi quá xa ý tưởng này. Các vòng lặp không đồng bộ là cần thiết khi có một số lượng lớn các lần lặp lại hoặc khi các thao tác trong vòng lặp phức tạp. Nhưng đối với các tác vụ đơn giản như lặp qua một mảng nhỏ, không có lý do gì để phức tạp hóa mọi thứ bằng cách sử dụng một hàm đệ quy phức tạp. Một vòng lặp for/while đồng bộ đơn giản hoạt động tốt và cũng sẽ nhanh hơn và dễ đọc hơn


Peter đặc nhiệm

@petetasker

Peter là nhà phát triển PHP và JavaScript đến từ Ottawa, Ontario, Canada. Anh hiện đang làm việc trong nhóm WP Migrate DB Pro tại Delicious Brains. Trong một kiếp trước, anh ấy đã làm việc cho các cơ quan tiếp thị và quan hệ công chúng. Anh ấy thích WordPress và không thích FTP

“Mã không đồng bộ thường được sử dụng khi…”

Viết JavaScript, đặc biệt là với trình xử lý AJAX hoặc lệnh gọi lại. Nó có thể gây ra vấn đề khi sử dụng không đúng cách, tuy nhiên. Chúng tôi làm việc với các nhà phát triển WordPress, những người thường gặp phải vấn đề này khi lồng các hàm gọi lại ẩn danh. Ví dụ: bạn muốn thực hiện một yêu cầu AJAX phụ thuộc vào yêu cầu AJAX trước đó. Cuối cùng, các nhà phát triển có thể tạo các hàm gọi lại ẩn danh lồng nhau, điều này có thể dẫn đến mã lộn xộn và khó khăn khi gỡ lỗi. Với JavaScript hiện đại, điều này có thể tránh được bằng Lời hứa hoặc trừu tượng hóa các hàm được đặt tên


Ashish Datta

@adatta02

Sinh ra và lớn lên ở North Jersey, Ashish tốt nghiệp Đại học Tufts với bằng Cử nhân khoa học máy tính. Sau Tufts, Ashish giữ vai trò kỹ sư tại ArmchairGM và Wikia trước khi thành lập Set five Consulting. Bên ngoài văn phòng, bạn có thể tìm thấy Ashish trong phòng tập thể dục, chạy bộ hoặc nhấm nháp ly cocktail với ngón tay út của anh ấy

“Một điểm khác biệt mà nhiều lập trình viên bỏ lỡ là…”

Sự khác biệt giữa lập trình không đồng bộ và đồng thời. Ở cấp độ cao, không đồng bộ là khả năng làm một việc gì đó trong khi chờ một việc khác hoàn thành và đồng thời là khả năng tính toán nhiều thứ cùng lúc, sự đánh đổi lớn so với. thực thi tuần tự có nghĩa là cả lập trình đồng thời và không đồng bộ đều làm tăng thêm độ phức tạp

Với sự bùng nổ về mức độ phổ biến của nodejs, môi trường có môi trường không đồng bộ, các lập trình viên ngày càng sử dụng lập trình không đồng bộ trong những tình huống mà nó không mang lại lợi ích gì. Nói chung, các tác vụ ràng buộc của CPU rơi vào nhóm này và các ví dụ sẽ là hầu hết các thuật toán học máy, bước chuyển đổi trong quy trình ETL và bất kỳ loại khai thác tiền điện tử nào


Johannes Kadak

@Qminder

Johannes là Nhà phát triển chính tại Qminder

“Lập trình đồng bộ phù hợp hơn cho…”

Các tác vụ tuần tự, trong đó việc dừng toàn bộ chương trình để chờ yêu cầu mạng hoặc đĩa IO có ý nghĩa

Lập trình không đồng bộ phù hợp hơn với mã phải phản hồi các sự kiện – ví dụ: bất kỳ loại giao diện người dùng đồ họa nào

Một ví dụ về tình huống mà các lập trình viên sử dụng async nhưng không nên là bất kỳ mã nào có thể tập trung hoàn toàn vào xử lý dữ liệu và có thể chấp nhận khối "dừng thế giới" trong khi chờ dữ liệu tải xuống


Mạng lưới nhà phát triển Microsoft

@Microsoft

Mạng Nhà phát triển của Microsoft là tài nguyên của bạn về các mẹo, thủ thuật, nghiên cứu, nghiên cứu điển hình về phát triển...Mọi thứ bạn cần để phát triển các ứng dụng mà người dùng yêu thích

GHI CHÚ. Thông tin sau đây được trích từ Lập trình không đồng bộ với Async và Await (C# và Visual Basic) qua MSDN.  

“Không đồng bộ là điều cần thiết cho các hoạt động có khả năng bị chặn, chẳng hạn như khi ứng dụng của bạn truy cập web…”

Truy cập vào tài nguyên web đôi khi bị chậm hoặc bị trì hoãn. Nếu một hoạt động như vậy bị chặn trong một quy trình đồng bộ, toàn bộ ứng dụng phải đợi. Trong quy trình không đồng bộ, ứng dụng có thể tiếp tục với công việc khác không phụ thuộc vào tài nguyên web cho đến khi tác vụ có khả năng chặn kết thúc


Mark Patterson

Mark Patterson là một. NET và người sáng lập HealthSpan Foods

GHI CHÚ. Thông tin sau đây được trích từ Await Overhead Khoảng 50 + (n * 15) ms qua diễn đàn Microsoft Developer Network.  

“Xem xét thể dục dụng cụ của bang đang được thực hiện, người điều khiển Await rất hiệu quả. Hình phạt hiệu suất trên một máy nhanh dường như là khoảng…”

50 + (n * 15) mili giây

Trong đó 50 mili giây là độ trễ thiết lập một lần được hoãn lại cho đến khi chạy lần đầu tiên một phương thức không đồng bộ gặp toán tử Đang chờ. Hình phạt cho mỗi thao tác Chờ (bao gồm cả thao tác đầu tiên) là khoảng 15 ms

Tôi đã đạt được những ước tính sơ bộ này bằng cách so sánh thời gian cần thiết để tải hình ảnh đồng bộ với. không đồng bộ. Rõ ràng là kết quả của bạn sẽ thay đổi tùy thuộc vào tốc độ máy của bạn, kích thước của trạng thái được lưu và tải lại cũng như số lượng luồng cạnh tranh có thể trì hoãn việc lên lịch tiếp tục

Tuy nhiên, khám phá nhỏ này gợi ý cho tôi rằng

1) Không có ý nghĩa gì khi chờ các tác vụ ĐÁNG TIN CẬY tiêu thụ <= 20 ms. Rõ ràng là một nhiệm vụ không đáng tin cậy, thậm chí là một nhiệm vụ rất ngắn – ví dụ 1 hoặc 2 ms – vẫn có thể là một ứng cử viên rất tốt cho Đang chờ. Ví dụ: nếu một tác vụ IO thất bại 1 trên 100 lần thì tác vụ đó được coi là rất không đáng tin cậy và Chờ hoàn thành tác vụ này sẽ là một cách để quản lý sự không chắc chắn này

2) Không có hình phạt nào đối với mã hóa phương thức Async nếu không bao giờ gặp toán tử Await. Điều này giúp bạn dễ dàng viết các phương thức có thể chạy đồng bộ hoặc không đồng bộ tùy thuộc vào tham số IsAsync được truyền cho phương thức. Trong mã giả một cái gì đó như thế này

Private Async Sub DoSomething(ByVal IsAsync as Boolean)

Dim Result as T
If IsAsync Then
Result = Await SomethingTask
Else
Result = Something
End if

UseResult(Result)
End Sub

Private Function Something() as T
Dim Result as T
...
Return Result
End Function

Private Function SomethingTask() as Task(of T)
Dim f = New Func(of T)(AddressOf Something)
Dim s = TaskScheduler.FromCurrentSynchronizationContext
Dim tf = New TaskFactory(of T)(s)
Return tf.StartNew(f)
End Function

(Lưu ý rằng CurrentSynchronizationContext được sử dụng ở trên chỉ bắt buộc nếu tác vụ Async của bạn cần chạy trên cùng một chuỗi khi phương thức Async được gọi trên. Trong Silverlight, BẤT CỨ ĐIỀU GÌ chạm vào giao diện người dùng phải
trên chuỗi giao diện người dùng chẳng hạn. )


Đại học Brown Khoa học máy tính

@BrownCSDept

Kể từ năm 1979, Khoa Khoa học Máy tính của Brown đã tạo ra một con đường nghiên cứu và giảng dạy công nghệ thông tin sáng tạo

GHI CHÚ. Thông tin này được trích từ Giới thiệu về Lập trình không đồng bộ thông qua Chương trình Khoa học Máy tính của Đại học Brown.  

“So với mô hình đồng bộ, mô hình không đồng bộ hoạt động tốt nhất khi…”

  • Có rất nhiều nhiệm vụ nên luôn có ít nhất một nhiệm vụ có thể tiến triển
  • Tác vụ thực hiện nhiều I/O, khiến chương trình đồng bộ lãng phí nhiều thời gian khi bị chặn khi
    tác vụ khác có thể đang chạy.
  • Các tác vụ phần lớn độc lập với nhau nên ít cần giao tiếp giữa các tác vụ
    (và do đó, tác vụ này phải đợi tác vụ khác).

Các điều kiện này gần như mô tả hoàn hảo một máy chủ mạng bận điển hình (như máy chủ web) trong
môi trường máy khách-máy chủ. Mỗi tác vụ đại diện cho một yêu cầu của khách hàng với I/O dưới dạng nhận
yêu cầu và gửi trả lời. Việc triển khai máy chủ mạng là ứng cử viên chính cho mô hình
không đồng bộ, đó là lý do tại sao Twisted và Node. js, trong số các thư viện máy chủ không đồng bộ khác, đã trở nên phổ biến
rất nhiều trong những năm gần đây.


Maria Yakimova

@djangostars

Maria Yakimova là nhà phát triển Python/Django tại Django Stars

GHI CHÚ. Thông tin sau được trích từ Lập trình không đồng bộ trong Python. Asyncio (Hướng dẫn) qua Django Stars.  

“Trong một chương trình tuần tự cổ điển, tất cả các hướng dẫn bạn gửi đến trình thông dịch sẽ được thực hiện từng cái một. Thật dễ dàng để hình dung và dự đoán đầu ra của một mã như vậy. Nhưng mà…"

Giả sử bạn có tập lệnh yêu cầu dữ liệu từ 3 máy chủ khác nhau. Đôi khi, tùy thuộc vào người biết điều gì, yêu cầu đến một trong những máy chủ đó có thể mất quá nhiều thời gian để thực hiện. Hãy tưởng tượng rằng phải mất 10 giây để lấy dữ liệu từ máy chủ thứ hai. Trong khi bạn đang chờ đợi, toàn bộ kịch bản thực sự không làm gì cả. Điều gì sẽ xảy ra nếu bạn có thể viết một tập lệnh có thể, thay vì đợi yêu cầu thứ hai, chỉ cần bỏ qua nó và bắt đầu thực hiện yêu cầu thứ ba, sau đó quay lại yêu cầu thứ hai và tiếp tục từ nơi nó rời đi? . Bạn giảm thiểu thời gian nhàn rỗi bằng cách chuyển đổi nhiệm vụ

Tuy nhiên, bạn không muốn sử dụng mã không đồng bộ khi bạn cần một tập lệnh đơn giản, có ít hoặc không có I/O

Một điều quan trọng hơn cần đề cập là tất cả mã đang chạy trong một luồng. Vì vậy, nếu bạn mong đợi rằng một phần của chương trình sẽ được thực thi ở chế độ nền trong khi chương trình của bạn sẽ làm việc khác, thì điều này sẽ không xảy ra


Brij Bhushan Mishra

@code_wala

Brij Bhushan Mishra có hơn 8 năm kinh nghiệm và hiện đang làm Kiến trúc sư/Tư vấn. Anh có niềm đam mê tìm hiểu về máy tính từ nhỏ. Anh ấy viết blog tại Code Wala

GHI CHÚ. Thông tin sau đây được trích từ Lập trình đồng thời so với đa luồng so với lập trình không đồng bộ. Giải thích qua Code Wala.  

“Có hai điều rất quan trọng đối với bất kỳ ứng dụng nào – Khả năng sử dụng và Hiệu suất…”

Khả năng sử dụng bởi vì, giả sử, người dùng nhấp vào nút để lưu một số dữ liệu. Điều này yêu cầu nhiều tác vụ nhỏ hơn như đọc và điền dữ liệu vào đối tượng bên trong, thiết lập kết nối với SQL và lưu nó ở đó, v.v. Vì SQL chạy trên một máy khác trong mạng và chạy theo một quy trình khác nên có thể tốn thời gian và có thể lâu hơn một chút. Vì vậy, nếu ứng dụng chạy trên một luồng đơn thì màn hình sẽ ở trạng thái treo cho đến khi tất cả các tác vụ hoàn thành, đây là một trải nghiệm người dùng rất tệ. Đó là lý do tại sao ngày nay nhiều ứng dụng và framework mới hoàn toàn dựa vào mô hình không đồng bộ

Hiệu suất của một ứng dụng cũng rất quan trọng. Người ta thấy rằng trong khi thực hiện một yêu cầu, khoảng 70-80% thời gian bị lãng phí trong khi chờ đợi các tác vụ phụ thuộc. Vì vậy, nó có thể được sử dụng tối đa bằng cách lập trình không đồng bộ, trong đó một khi tác vụ được chuyển cho một quy trình khác (giả sử SQL), luồng hiện tại sẽ lưu trạng thái và sẵn sàng nhận một tác vụ khác. Khi tác vụ SQL hoàn thành, bất kỳ luồng nào rảnh có thể tiếp tục


Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong javascript
Eric Vogel

@VSMdev

Eric Vogel là một chuyên mục tại Tạp chí Visual Studio. Anh ấy là Kỹ sư phần mềm cao cấp tại Red Cedar Solutions Group và là Chủ tịch tại Great Lansing User Group cho. BỌC LƯỚI

GHI CHÚ. Thông tin sau đây được trích từ Lập trình không đồng bộ trong. BỌC LƯỚI. Tôi sẽ gọi lại cho bạn qua Tạp chí Visual Studio.  

“Lập trình không đồng bộ là một phương tiện lập trình song song trong đó một đơn vị công việc chạy tách biệt với luồng ứng dụng chính và thông báo cho luồng gọi về sự hoàn thành, lỗi hoặc tiến trình của nó…”

Bạn có thể tự hỏi khi nào bạn nên sử dụng lập trình không đồng bộ và lợi ích cũng như vấn đề của nó là gì

Những lợi ích chính mà người ta có thể đạt được từ việc sử dụng lập trình không đồng bộ là cải thiện hiệu suất và khả năng phản hồi của ứng dụng. Một ứng dụng đặc biệt phù hợp cho mẫu không đồng bộ là cung cấp giao diện người dùng đáp ứng trong ứng dụng khách trong khi chạy một hoạt động tốn tài nguyên hoặc tính toán

Các. NET Framework cung cấp một số cách để bắt đầu lập trình không đồng bộ. Một số lựa chọn triển khai của bạn từ cơ bản nhất đến phức tạp bao gồm sử dụng trình chạy nền, gọi phương thức không đồng bộ từ đại biểu hoặc triển khai giao diện IAsynchResult. Tất cả các tùy chọn này cho phép bạn đa luồng ứng dụng của mình mà không cần phải quản lý các luồng của riêng bạn. Các. NET Framework API không đồng bộ xử lý công việc cực nhọc này cho bạn


Lập trình không đồng bộ là gì và tại sao nó lại quan trọng trong javascript


Peter Olson

@pluralsight

Peter Olson góp phần hack. hướng dẫn() trên Pluralsight. Bạn cũng có thể tìm thấy anh ấy trên GitHub

GHI CHÚ. Thông tin sau đây được trích từ Giới thiệu về JavaScript không đồng bộ qua Pluralsight.  

“Trong các chương trình không đồng bộ, bạn có thể có hai dòng mã (L1 theo sau là L2), trong đó L1 lên lịch cho một số tác vụ sẽ được chạy trong tương lai, nhưng L2 chạy trước khi tác vụ đó hoàn thành…”

Bạn có thể tưởng tượng như thể bạn đang ăn ở một nhà hàng ngồi. Những người khác gọi món ăn của họ. Bạn cũng có thể đặt món ăn của bạn. Bạn không cần đợi họ nhận đồ ăn và ăn xong rồi mới gọi món. Tương tự như vậy, người khác không cần phải đợi bạn lấy đồ ăn và ăn xong rồi mới gọi món. Mọi người sẽ nhận được thức ăn của họ ngay sau khi nó được nấu xong

Trình tự mà mọi người nhận thức ăn của họ thường tương quan với trình tự mà họ gọi món ăn, nhưng những trình tự này không phải lúc nào cũng giống hệt nhau. Ví dụ: nếu bạn gọi một miếng bít tết, sau đó tôi gọi một ly nước, tôi có thể sẽ nhận được đơn đặt hàng của mình trước, vì thường không mất nhiều thời gian để phục vụ một ly nước như khi chuẩn bị và phục vụ một món ăn.

Lưu ý rằng không đồng bộ không có nghĩa giống như đồng thời hoặc đa luồng. JavaScript có thể có mã không đồng bộ nhưng nói chung là mã đơn luồng. Đây giống như một nhà hàng chỉ có một nhân viên làm tất cả công việc chờ đợi và nấu nướng. Nhưng nếu nhân viên này làm việc đủ nhanh và có thể chuyển đổi giữa các nhiệm vụ đủ hiệu quả, thì nhà hàng dường như có nhiều nhân viên

Hàm setTimeout có lẽ là cách đơn giản nhất để lập lịch mã không đồng bộ để chạy trong tương lai

// Say "Hello."

console.log("Hello.");

// Say "Goodbye" two seconds from now.

setTimeout(function() {

console.log("Goodbye!");

}, 2000);

// Say "Hello again!"

console.log("Hello again!");

Nếu bạn chỉ quen với mã đồng bộ, bạn có thể mong đợi mã ở trên hoạt động theo cách sau

  • Nói “Xin chào”
  • Không làm gì trong hai giây
  • Nói lời tạm biệt. ”
  • Nói “Xin chào một lần nữa. ”

Nhưng setTimeout không tạm dừng việc thực thi mã. Nó chỉ lên lịch một việc gì đó sẽ xảy ra trong tương lai, và sau đó ngay lập tức tiếp tục sang dòng tiếp theo

  • Nói “Xin chào. ”
  • Nói “Xin chào một lần nữa. ”
  • Không làm gì trong hai giây
  • Nói lời tạm biệt. ”


Niềm vui George Kunjikkuru

@OrionSIOfficial

Joy George Kunjikkuru là một kỹ sư phần mềm đầy nhiệt huyết có kiến ​​thức chuyên môn sâu về kho công nghệ của Microsoft (. Biểu mẫu Windows Net, ASP. NET, Silverlight, SQL Server) cũng như trong các công nghệ web mở bao gồm JavaScript, AngularJS, TypeScript, HTML5, NodeJS, Azure, C#, ASP. Net MVC, WPF, WCF, LINQ, và nhiều hơn nữa. Joy có bằng MBA của Đại học Bharathiar, Coimbatore và bằng B. Bằng công nghệ về Khoa học Máy tính của Đại học Anna, Chennai

GHI CHÚ. Thông tin sau đây được trích từ mô hình lập trình C# async và đang chờ từ đầu thông qua Orion.  

“Lập trình không đồng bộ là điều cần thiết khi chúng ta phát triển bất kỳ ứng dụng nào vì nó tránh phải chờ đợi trong luồng chính trong các hoạt động chạy dài chẳng hạn như I/O đĩa, hoạt động mạng, truy cập cơ sở dữ liệu, v.v…”

Trong trường hợp bình thường, nếu chương trình của chúng tôi cần thực hiện điều gì đó từ kết quả của các thao tác dài này, mã của chúng tôi sẽ bị kẹt cho đến khi thao tác được thực hiện và chúng tôi tiếp tục từ thời điểm đó

Sử dụng cơ chế không đồng bộ, chúng ta có thể kích hoạt các hoạt động chạy dài và tiếp tục với các tác vụ khác. Các hoạt động chạy dài này thực hiện công việc trong một luồng khác và khi chúng hoàn thành, chúng sẽ thông báo cho mã chính của chúng tôi và mã của chúng tôi có thể thực hiện các tác vụ đăng từ đây. Khi chúng tôi đề cập đến mã của mình, chúng tôi đang nói về luồng chính liên quan đến giao diện người dùng hoặc luồng chủ yếu xử lý yêu cầu web


Sathyaish Chakravarthy

Sathyaish Chakravarthy đã lập trình từ đầu năm 1997. Lĩnh vực chuyên môn của anh ấy là Microsoft. Nền tảng NET. Anh ấy cũng có thể làm việc với các ngôn ngữ khác như Java, Kotlin, Python, Ruby, JavaScript và C/C++. Anh ấy là nhà phát triển full-stack tự do. Tìm anh ấy trên GitHub và StackOverflow

GHI CHÚ. Thông tin sau được trích từ Lợi ích của việc sử dụng lập trình không đồng bộ trên một máy lõi đơn là gì? .  

“Tất cả các hoạt động mà một chương trình máy tính thực hiện có thể được phân loại thành hai loại lớn…”

  • Các hoạt động liên quan đến tính toán;
  • Hoạt động giới hạn I/O

Các hoạt động liên quan đến điện toán sử dụng CPU để thực hiện một số công việc. Các ví dụ đang xử lý một số số, thực hiện các phép tính toán học chẳng hạn như tìm căn bậc hai của một số hoặc giá trị của hằng số Pi thành một số thập phân cố định nhưng khá lớn, nội suy các bit bị thiếu trong một ảnh bitmap, thực hiện một phép toán trên hai

Mặt khác, các hoạt động liên kết I/O hoàn toàn không sử dụng CPU. Họ gửi yêu cầu tới trình điều khiển thiết bị I/O và đợi trình điều khiển ngắt để thông báo cho họ về sự sẵn sàng của kết quả hoạt động được yêu cầu của họ. Ví dụ về các thao tác liên kết I/O là đọc từ đĩa hoặc ghi vào đĩa, tôi. e. , đọc hoặc ghi vào tập tin. Điều này có thể có nhiều dạng khác nhau như thực hiện truy vấn trên cơ sở dữ liệu, đọc hoặc ghi vào cơ sở dữ liệu, đọc từ hoặc ghi vào ổ cắm mạng, gửi yêu cầu đến ổ đĩa CD-ROM, đọc hoặc ghi vào bộ nhớ, nhận đầu vào từ . e. , màn hình, v.v.

Khi một chương trình thực hiện thao tác liên kết I/O, nó sẽ gửi một yêu cầu tới API hệ điều hành cơ bản để chuyển tiếp yêu cầu của nó tới trình điều khiển thiết bị thích hợp

Mỗi HĐH bao gồm cả phiên bản đồng bộ và phiên bản API không đồng bộ cho các hoạt động liên kết I/O

Nếu chương trình máy tính của bạn thực hiện cuộc gọi đến phiên bản đồng bộ của API giới hạn I/O của hệ điều hành, thì trong khi chờ đợi kết quả từ trình điều khiển thiết bị, về cơ bản, nó sẽ bị chặn thực hiện bất kỳ điều gì khác. Chuỗi được phân bổ để thực hiện thao tác chỉ cần đợi kết quả. Tất cả thời gian này trong khi luồng chờ kết quả từ trình điều khiển thiết bị, hệ điều hành sẽ không bao giờ lên lịch cho nó ở hàng đợi sẵn sàng. Do đó, nó sẽ không có thời gian CPU. Do đó, nếu chương trình của bạn cần thực hiện một thao tác đồng thời khác vào lúc này, thì nó cần một luồng bổ sung

Tạo một luồng bổ sung liên quan đến chi phí hoạt động đáng kể. Ngoài ra, nó làm giảm khả năng mở rộng vì nhiều luồng hiện đang làm những việc mà bất kỳ luồng nào không cần làm, tôi. e. , chỉ cần đợi trình điều khiển thiết bị

Mặt khác, nếu chương trình máy tính của bạn gọi phiên bản không đồng bộ của API I/O của hệ điều hành, luồng được phân bổ để thực hiện thao tác đó chỉ cần đưa ra yêu cầu tới trình điều khiển thiết bị và ngay lập tức trả về. Bây giờ có thể tự do thực hiện bất kỳ công việc nào khác mà chương trình của bạn muốn thực hiện đồng thời. Nếu không có gì bắt buộc phải thực hiện đồng thời, nó có thể tiếp tục nghe tin nhắn từ hàng đợi / bộ điều phối tin nhắn của hệ điều hành

Điều đó có nghĩa là nếu chương trình của bạn đang chạy trong môi trường hướng sự kiện, chẳng hạn như môi trường giao diện người dùng đồ họa, thì nó sẽ cung cấp giao diện người dùng phản hồi nhanh hơn cho người dùng, cho phép anh ta nhấp tùy ý trong khi hoạt động liên kết I/O vẫn còn.

Cho dù máy của bạn có lõi đơn hay không, việc gọi phiên bản không đồng bộ của API ràng buộc I/O sẽ cung cấp khả năng mở rộng tốt hơn cho ứng dụng của bạn vì nó loại bỏ nhu cầu tạo chuỗi khi không cần thiết


Richard Rodgers

@KeyNCar

Richard Rodgers là một doanh nhân, hiện là Kiến trúc sư và Nhà phát triển phần mềm tại Key and Car Tracking LLC. Trước đây, ông đã thành lập TechMate Inc. và đã từng là Chủ tịch công ty từ năm 1993

GHI CHÚ. Thông tin sau đây được trích từ Những tình huống nào trong lập trình chúng ta có thể cần sử dụng thao tác không đồng bộ? .  

“Khi bạn cần đợi một quy trình khác hoàn tất, sẽ rất hữu ích nếu chuyển sang không đồng bộ…”

Điều này cho phép bạn tiếp tục các hoạt động khác thay vì chỉ chờ đợi. Hoạt động có thể chỉ đơn giản là một quá trình chạy dài, chẳng hạn như một phép biến đổi đồ họa quan trọng hoặc phép tính toán học. Hoặc, phổ biến hơn, đó là một số loại hoạt động đầu vào/đầu ra (IO). Thông thường, bạn muốn chạy nhiều loại quy trình giống nhau này đồng thời và mã hóa không đồng bộ cho phép bạn thực hiện điều đó

Truyền thông hướng sự kiện là một mô hình không đồng bộ phổ biến. Về cơ bản, bạn thiết lập giao tiếp và cung cấp mã, được gọi là gọi lại, mã này sẽ chạy khi giao tiếp diễn ra

Ví dụ: tôi hiện đang sử dụng WebSockets. Vì vậy, tôi mở ổ cắm và cung cấp các cuộc gọi lại cho nó, bao gồm cả những cuộc gọi lại để nhận tin nhắn, nhận ra lỗi hoặc đóng ổ cắm. Bất cứ khi nào có tin nhắn đến, cuộc gọi lại tin nhắn của tôi sẽ chạy. Nếu xảy ra lỗi, tôi sẽ xử lý lỗi trong cuộc gọi lại đó. Nếu đối tác liên lạc của tôi chấm dứt, cuộc gọi lại gần của tôi sẽ dọn sạch môi trường của tôi. Sử dụng các cuộc gọi lại này, tôi có thể chạy đi và làm việc khác khi biết rằng, nếu có điều gì đó xảy ra mà tôi cần xử lý, cuộc gọi lại thích hợp sẽ kích hoạt

Mã hóa không đồng bộ thường có nghĩa là bạn cần đa luồng mã của mình. Điều này có nghĩa là bạn phải bắt đầu một luồng khác có thể chạy độc lập với tác vụ chính của bạn. Điều này thường là cần thiết bởi vì, ví dụ, chờ giao tiếp hoàn tất sẽ dừng hoàn toàn luồng đang chờ chạy. Thuật ngữ cho điều này là “chặn. ” Nếu bạn đưa ra một lệnh giao tiếp đang bị chặn, nó sẽ dừng và chờ tin nhắn đến hoặc nếu không có tin nhắn đến, lệnh đó sẽ hết thời gian chờ. Chạy cái này trong một luồng riêng biệt sẽ ngăn chương trình chính của bạn phải chờ

Hầu hết các ngôn ngữ cấp cao đều cung cấp các thư viện hỗ trợ lập trình hướng sự kiện và/hoặc không đồng bộ

Hãy dùng thử Prefix, trình lược tả mã miễn phí của Stackify, để viết mã tốt hơn trên máy trạm của bạn. Tiền tố hoạt động với. NET, Java, PHP, Nút. js, Ruby và Python

# # #

Lập trình không đồng bộ thực sự dễ dàng hơn bạn nghĩ. Hãy xem bài đăng này để tìm hiểu cách trả về phản hồi AJAX từ lệnh gọi JavaScript không đồng bộ. Hoặc, đọc bài đăng này để biết thêm thông tin về cách Microsoft đã đơn giản hóa việc lập trình không đồng bộ với việc triển khai async đang chờ trong C# và cách các phiên bản mới nhất của ASP. NET đang sử dụng nó để tăng hiệu suất

JavaScript không đồng bộ có quan trọng không?

Lập trình không đồng bộ có thể diễn đạt thời gian chờ cho các tác vụ chạy dài mà không làm đóng băng chương trình trong các tác vụ này . Các môi trường JavaScript thường triển khai kiểu lập trình này bằng cách sử dụng các hàm gọi lại, các hàm được gọi khi các hành động hoàn thành.

Không đồng bộ và đồng bộ trong JavaScript là gì?

Không đồng bộ là một kiến ​​trúc không chặn, vì vậy việc thực thi một tác vụ không phụ thuộc vào tác vụ khác. Nhiệm vụ có thể chạy đồng thời. Đồng bộ là một kiến ​​trúc chặn, vì vậy việc thực hiện từng thao tác phụ thuộc vào việc hoàn thành thao tác trước nó

Những lợi ích của mã không đồng bộ là gì?

Những lợi ích chính của việc lập trình không đồng bộ bằng cách sử dụng async/await bao gồm những điều sau. Tăng hiệu suất và khả năng đáp ứng của ứng dụng của bạn , đặc biệt khi bạn có các hoạt động chạy trong thời gian dài không yêu cầu chặn quá trình thực thi.