Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Gần đây tôi đã có rất nhiều cuộc thảo luận về hiệu suất trong PHP. Mặc dù chúng tôi có PHP 8, JIT và tất cả các cải tiến khác, mọi người vẫn tiếp tục phàn nàn về PHP. Đó là ngôn ngữ chỉ dành cho vòng tròn yêu cầu-phản hồi. PHP đó rất chậm và không thể được sử dụng trong các hệ thống tải cao. Một mặt vâng, đó là sự thật. Nếu chúng ta muốn xây dựng thứ gì đó thực sự hiệu quả – PHP chặn cổ điển không phải là lựa chọn phù hợp. Phần lớn các hàm và thư viện PHP được xây dựng để hoạt động trong môi trường chặn truyền thống, sự thật mà nói, không phải là về hiệu suất. Đừng để nó làm bạn thất vọng và sử dụng một ngôn ngữ khác để giải quyết các tác vụ nhạy cảm với hiệu suất. PHP có thể nhanh, hơn nữa, nó có thể rất nhanh. Thế nào? . khi chúng tôi tính toán điều gì đó phức tạp hoặc khi chúng tôi có một số I/O bị chặn. Cái đầu tiên không thể (hoặc có thể?) được giải quyết trong PHP và nếu bạn đang cố gắng giải quyết hơn 50 trình phân giải GraphQL lồng nhau, có thể PHP không phải là lựa chọn tốt nhất (giống như NodeJ) cho bạn. Vấn đề thứ hai với I/O bị chặn không thực sự là vấn đề đối với PHP (cũng giống như đối với NodeJs). Cộng đồng đã viết mã PHP không đồng bộ trong nhiều năm. Và trong suốt những năm qua, trong khi một số phần nhỏ của cộng đồng PHP tiếp tục sử dụng và viết các công cụ không đồng bộ, thì phần lớn các nhà phát triển PHP (và không chỉ PHP) vẫn coi PHP không đồng bộ là một thứ gì đó “hoang dã”. “Bạn có thể thực sự tuyệt vọng nếu viết mã không đồng bộ bằng PHP” - Tôi đã nghe rất nhiều lần. Hãy thành thật mà nói, chúng tôi có thành kiến ​​rằng PHP không phải là công cụ phù hợp cho loại công cụ này. Trong hầu hết các trường hợp, xu hướng này dựa trên một số giả định sai về PHP và về từ “không đồng bộ”. Giả định sai dẫn đến kỳ vọng sai, dẫn đến việc đổ lỗi cho PHP không đồng bộ rằng nó không “không đồng bộ thực sự”

Trong bài viết này, tôi muốn thảo luận về một số giả định và niềm tin sai phổ biến về PHP không đồng bộ. Trước khi chúng ta bắt đầu thảo luận về PHP không đồng bộ, điều cần thiết là phải hiểu những điều cơ bản. Hãy bắt đầu cuộc hành trình

Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Đồng thời và song song

Trước tiên, chúng ta cần hiểu sự khác biệt giữa thực thi đồng bộ và không đồng bộ. Hãy nhanh chóng sửa lại nó để đảm bảo rằng chúng ta đang ở trên cùng một trang. Và sau đó chúng ta sẽ chuyển sang các chủ đề phức tạp hơn. Hãy xem xét một chương trình thực hiện hai yêu cầu mạng. Với cách tiếp cận đồng bộ truyền thống, mã được thực thi tuần tự

  • gửi yêu cầu đầu tiên
  • đợi cho đến khi nhận được phản hồi
  • gửi yêu cầu thứ hai
  • đợi cho đến khi nhận được phản hồi thứ hai

Ở đây mỗi hoạt động chặn dòng chảy. Trong hầu hết các trường hợp, cách tiếp cận này là tốt. Các vấn đề xảy ra khi chúng tôi có nhiều hoạt động chặn, trong khi hiệu suất là rất quan trọng. Chương trình không sử dụng tất cả các tài nguyên có sẵn, do đó có thể mất nhiều thời gian chỉ để chờ đợi và không làm gì cả. Trong khi chờ yêu cầu mạng kết thúc (hoạt động liên kết I/O), CPU vẫn ở chế độ chờ. Và ngược lại khi đang tính toán gì đó (hoạt động liên kết với CPU) thì chương trình “đơ” và không phản hồi dữ liệu đầu vào

Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Cách tiếp cận không đồng bộ cung cấp một giải pháp để chặn nội dung. Luồng không đồng bộ thực thi nhiều việc cùng một lúc và chúng tôi không phải đợi tác vụ hiện tại kết thúc trước khi chuyển sang tác vụ tiếp theo. Hoạt động không đồng bộ không bị chặn và chỉ bắt đầu hoạt động. Tiếp tục với các yêu cầu mạng ví dụ trước hiện đang chạy đồng thời. Ngoài ra, có vẻ như chúng chạy song song (thực tế thì không)

Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Vấn đề cốt lõi khi tranh luận về PHP không đồng bộ thực sự là sự hiểu lầm về ý nghĩa của đồng thời. Mọi người thường nhầm lẫn giữa thực thi không đồng bộ với thực thi song song. “PHP không thực sự là bất đồng bộ vì chúng ta không thể thực thi mọi thứ song song” - Tôi đã nghe nhiều lần. Sự khác biệt chính là đồng thời là một vấn đề chung, rộng hơn nhiều so với song song

Với việc thực thi đồng thời, chúng tôi có hai tác vụ có thể bắt đầu, chạy và hoàn thành trong các khoảng thời gian chồng chéo. Điều đó không có nghĩa là chúng sẽ chạy cùng một lúc. Một ví dụ rất hay là máy tính của bạn. Khi chúng ta thực thi hai chương trình (hoặc một chương trình đa luồng) trên một CPU lõi đơn, không có cách nào để chạy các chương trình này song song. Họ phải chia sẻ một thời gian CPU duy nhất. Vì vậy, HĐH quyết định chạy một chương trình trước rồi đến chương trình kia. Hoặc có thể nó quyết định chạy một phần nhỏ của chương trình này và một phần nhỏ của chương trình khác. Chương trình thứ hai có thể bắt đầu ngay cả trước khi chương trình thứ nhất kết thúc

Ngược lại, song song là khi hai tác vụ thực sự chạy cùng một lúc. Nếu chúng ta tiếp tục với ví dụ tương tự như trên, hãy tưởng tượng một chương trình đa luồng trên bộ xử lý đa lõi. Thực thi song song yêu cầu phần cứng có nhiều đơn vị xử lý. Với CPU một lõi, bạn có thể đạt được đồng thời nhưng KHÔNG song song. Song song là một loại đồng thời cụ thể trong đó các tác vụ thực sự được thực thi đồng thời

Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Rõ ràng ở trên là ứng dụng có thể đồng thời — nhưng không song song, có nghĩa là nó xử lý nhiều tác vụ cùng một lúc, nhưng không có hai tác vụ nào được thực thi đồng thời ngay lập tức

Ok, bây giờ sự khác biệt giữa đồng thời và song song đã rõ ràng, nhưng PHP là ngôn ngữ lập trình đơn luồng. Là đơn luồng có nghĩa là chỉ có một dòng mã PHP có thể được thực thi bất kỳ lúc nào. à há. PHP không thực sự không đồng bộ. Tuy nhiên, chúng ta có thực sự cần phải có nhiều luồng để chạy mã không đồng bộ không?

Chủ đề và quy trình

Chúng tôi với tư cách là lập trình viên viết mã mà sau này được máy tính thực thi. Không quan trọng chúng ta sử dụng ngôn ngữ nào. C, Lisp hoặc PHP. Vào cuối ngày, mã của chúng tôi được biên dịch hoặc giải thích thành tệp nhị phân. Khi chúng tôi thực thi mã nhị phân này, chương trình cần một số tài nguyên từ HĐH để chạy. không gian địa chỉ bộ nhớ, PID (ID tiến trình) và một số thứ khác. Có thể có nhiều phiên bản của cùng một chương trình đang chạy, mỗi phiên bản là một quy trình riêng biệt trong HĐH. Chuyển đổi từ tiến trình này sang tiến trình khác cần một chút thời gian để lưu và tải các thanh ghi CPU, bộ nhớ và các tài nguyên khác. Tất cả các quá trình được cô lập. Chúng tôi có thể nói rằng mỗi quy trình tự coi mình là quy trình duy nhất đang chạy trên máy tính của chúng tôi và không có chương trình nào khác đang chạy vào lúc này. Bạn chắc chắn đã thấy tình huống khi một trong các chương trình của bạn bị “đơ”, nhưng bạn có thể thoát khỏi chương trình đó mà không ảnh hưởng đến các chương trình khác

Vì vậy, quá trình bắt đầu và nó nhận được bộ nhớ và tài nguyên của riêng mình. Tất cả các luồng trong quy trình chia sẻ bộ nhớ và tài nguyên đó. Mỗi quá trình có ít nhất một luồng được gọi là luồng chính. Khi luồng chính được thực hiện xong, quá trình và chương trình tự thoát. Người ta có thể coi một quy trình như một thùng chứa mã được biên dịch, bộ nhớ và các tài nguyên hệ điều hành khác nhau

Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Đồng thời đơn luồng

Có nhiều luồng bên trong quy trình (quy trình đa luồng), chúng ta có thể xử lý nhiều thứ cùng một lúc. Ngoài ra, trong hầu hết các trường hợp, chúng tôi có các hệ thống có nhiều bộ xử lý hoặc lõi CPU, trong đó nhiều quy trình hoặc luồng có thể được thực thi song song. Điều này cho phép chúng tôi triển khai đồng thời trong các chương trình của mình

Tuy nhiên, điều quan trọng là phải hiểu rằng đồng thời không có nghĩa là đa luồng. Trong nhiều trường hợp (thực tế - hầu hết các trường hợp), đồng thời đơn luồng là cách tốt nhất. Với tất cả những ưu điểm này của các luồng, các chương trình đa luồng có thể (sẽ) trở thành những con quái vật bị quá tải bởi các luồng. Có, chi phí liên lạc giữa các luồng thấp, nhưng nhược điểm là sự cố xảy ra với một luồng trong một quy trình chắc chắn sẽ ảnh hưởng đến các luồng khác và chính quy trình đó (hãy nói “xin chào” với đồng bộ hóa và bế tắc)

Hiệu suất của ứng dụng phụ thuộc vào mức độ tối ưu mà nó sử dụng các tài nguyên có sẵn (CPU, bộ nhớ, v.v.). Một số hoạt động trong chương trình của chúng tôi mất nhiều thời gian để hoàn thành và trong thời gian này, chúng tôi muốn có thể làm một việc khác. Đó là nơi cần đồng thời. Hãy xem xét hai lý do chính khiến các hoạt động tốn nhiều thời gian

  • Các hoạt động liên quan đến CPU liên quan đến tính toán nặng. Họ thực sự cần thời gian của CPU
  • Hoạt động giới hạn I/O phụ thuộc vào mạng/phần cứng/tương tác người dùng/v.v. Họ cần thời gian. Bởi vì họ cần chờ đợi điều gì đó xảy ra

Với CPU bị ràng buộc chặn, luồng bị chặn vì nó được thực thi tích cực. Ví dụ: khi tính toán thứ gì đó hoặc hiển thị mô hình 3d. Đối với các hoạt động liên kết với CPU, đa luồng được ưu tiên hơn, bởi vì trên các hệ thống đa bộ xử lý, một số luồng thực sự có thể được thực thi đồng thời. Bằng cách này, hiệu suất tổng thể cao hơn đạt được

Tuy nhiên, với hoạt động liên kết I/O, luồng bị chặn vì nó phải đợi dữ liệu trả về từ một số nguồn I/O (mạng, ổ cứng, v.v.). Hệ điều hành thấy rằng hiện tại không có dữ liệu và do đó đặt chuỗi ở trạng thái ngủ. Trong trường hợp này, luồng không được thực thi tích cực. Sự thật mà nói nó không làm gì cả, nhưng chờ đợi. Ở đây đa luồng là vô dụng. tạo một số luồng để chờ một số điều kiện xảy ra (phản hồi mạng hoặc hệ thống tệp) sẽ không giúp những điều kiện đó xảy ra nhanh hơn. Trên thực tế, một luồng đơn lẻ có thể đợi bất kỳ điều kiện nào được chỉ định xảy ra và thực hiện những gì cần thiết cho bất kỳ điều kiện nào trong số đó

Bây giờ, hãy nói về PHP. Trong hầu hết các trường hợp, nó là ngôn ngữ dành cho các ứng dụng web, nơi chúng tôi xử lý rất nhiều I/O. ghi một cái gì đó vào hệ thống tập tin, thực hiện các yêu cầu mạng hoặc xử lý bảng điều khiển. Lưu ý điều này, chúng ta nên xem xét rằng một PHP đơn luồng không phải là một hạn chế đối với việc triển khai đồng thời, mà là một cơ hội

I/O không chặn

Có một luồng không làm cho chương trình của chúng tôi không đồng bộ. Hơn nữa, khi chúng ta nói về I/O trong PHP, có vẻ như PHP được tạo ra với mục đích đồng bộ và ngăn chặn. Tất cả các chức năng gốc để xử lý các hoạt động I/O chặn toàn bộ ứng dụng

  • Bạn đã đọc tệp với fopen()?
  • Bạn truy vấn cơ sở dữ liệu bằng PDO?
  • Bạn muốn đọc một cái gì đó với file_get_contents()?

Chặn không phải lúc nào cũng xấu. Trong PHP, chúng ta thường không nghĩ liệu I/O trong ứng dụng của mình có bị chặn hay không. Và sự thật mà nói, rất hiếm khi có I/O non-blocking trong các ứng dụng PHP, đặc biệt là khi nói đến loại I/O mà chúng ta thường làm (yêu cầu HTTP, truy vấn cơ sở dữ liệu, v.v. ). Trong mô hình yêu cầu-phản hồi, chúng ta cần chặn mọi thứ vì đó là cách duy nhất để biết khi nào một thao tác được hoàn thành và có kết quả. Ví dụ: chúng tôi nhận được yêu cầu, truy vấn cơ sở dữ liệu, bằng cách nào đó xử lý kết quả, hiển thị HTML hoặc JSON và trả lại cho khách hàng dưới dạng phản hồi. Không có chỗ cho những thứ không chặn ở đây. Trong tất cả các bước này, chúng ta cần đợi. Chúng tôi cần kết quả từ hoạt động trước đó để tiếp tục. Non-blocking I/O hữu ích hơn nhiều trong mã phía máy chủ khi xử lý hàng nghìn yêu cầu máy khách song song. Vâng, tất nhiên, PHP là mã phía máy chủ, nhưng trước nó, chúng tôi luôn có Nginx hoặc Apache. Và những công cụ này cho phép chúng tôi viết mã PHP đồng bộ chặn. Trong PHP truyền thống, chúng tôi luôn xử lý một yêu cầu HTTP duy nhất và thực sự không quan tâm liệu mã của chúng tôi có bị chặn hay không

Nhưng, nếu chúng ta muốn triển khai một máy chủ HTTP bằng PHP thuần túy thì sao?

Vâng, tôi đã thấy câu trả lời điển hình rằng “PHP không được thiết kế cho nó”. Nhưng nếu tôi nói rằng chúng ta có thể. Có những công cụ cho nó. Bạn thậm chí không cần cài đặt bất kỳ tiện ích mở rộng bổ sung nào để chạy đồng thời mã PHP đơn luồng của mình

Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Thế nào? . Có I/O không chặn không đồng bộ, chúng tôi không cần nhiều luồng. Hệ điều hành chạy mã I/O song song cho chúng ta. Khi mã của chúng tôi gọi API không chặn, nó không đợi API này phản hồi. Luồng PHP có thể ngay lập tức tiếp tục thực thi mã xuất hiện sau lệnh gọi I/O này. Khi HĐH đã sẵn sàng và đã đến lúc gửi dữ liệu trở lại PHP, chúng tôi sẽ được thông báo. Tôi biết rằng nó nghe có vẻ lạ. Đặc biệt, hãy lưu ý đến mô hình phản hồi yêu cầu truyền thống. Làm cách nào để người tiêu dùng sử dụng API không chặn/không đồng bộ được thông báo? . Hầu hết hệ điều hành mà chúng tôi làm việc (Linux, Mac OS, Windows) đều có trình xử lý không đồng bộ, tôi. e. chúng tôi có thể yêu cầu họ làm điều gì đó và họ sẽ cung cấp kết quả trong một cuộc gọi lại. Tất nhiên, có nhiều cách khác để thể hiện một hành động không bị chặn bằng các lời hứa, coroutine, v.v. Nhưng về cơ bản, tất cả chúng đều dựa trên một quy trình (một chức năng) được gọi sau khi dữ liệu được trả về cho I/O. Hệ điều hành có nhiều luồng, sử dụng nó giúp truy cập các tài nguyên hệ thống khác nhau. HĐH có thể truy cập hệ thống tệp hoặc thực hiện cuộc gọi mạng trong các luồng khác nhau. Do đó, chương trình PHP của chúng tôi chỉ ủy quyền các tác vụ liên kết I/O cho HĐH và sau đó hoạt động dựa trên các kết quả nhận được trong cuộc gọi lại

Vấn đề là tập lệnh PHP “tuần tự” truyền thống không thể xử lý các cuộc gọi lại này. Ví dụ: chúng tôi muốn thực hiện hai yêu cầu HTTP đồng thời trong PHP



$client = new Browser();

$result1 = $client->get('http://google.com/');
$result2 = $client->get('https://github.com/reactphp');

Hãy tưởng tượng mã này nơi chúng tôi muốn thực hiện hai yêu cầu đồng thời. Các yêu cầu HTTP đại diện cho các hoạt động liên kết I/O, do đó, nếu chúng tôi chạy mã này không đồng bộ, chúng sẽ được ủy quyền cho HĐH. Chúng tôi bắt đầu yêu cầu đầu tiên, không đợi cho đến khi nó được thực hiện, và sau đó ngay lập tức bắt đầu yêu cầu thứ hai. Khi hệ điều hành hoàn thành các yêu cầu này, tập lệnh của chúng tôi sẽ được thông báo. Nhưng… Bạn có thấy vấn đề ở đây không? . Rất có thể khi yêu cầu hoàn thành, tập lệnh của chúng tôi sẽ thoát. Nó không còn gì để làm nữa. Một lần nữa, ở đây chúng tôi không đợi phản hồi, chúng tôi chỉ bắt đầu yêu cầu mạng. Nếu chúng tôi muốn xử lý phản hồi, chúng tôi cần hai điều

  • Cơ hội lắng nghe các sự kiện I/O
  • Không thoát khỏi tập lệnh nếu có bất kỳ tác vụ I/O nào đang chạy trong nền

Cả hai vấn đề đều có thể được giải quyết bằng vòng lặp sự kiện. Ví dụ trước có thể được viết lại theo cách sau



use React\Http\Browser;
use Psr\Http\Message\ResponseInterface;

$loop = React\EventLoop\Factory::create();
$client = new Browser($loop);

$result1 = $client->get('http://google.com/');
$result2 = $client->get('https://github.com/reactphp');

$loop->run();

Chúng tôi đã giới thiệu một đối tượng mới. ví dụ về vòng lặp sự kiện. Tôi đã sử dụng triển khai vòng lặp ReactPHP. Ở phần đầu của tập lệnh, chúng tôi tạo một vòng lặp và ở phần cuối của tập lệnh, chúng tôi



use React\Http\Browser;
use Psr\Http\Message\ResponseInterface;

$loop = React\EventLoop\Factory::create();
$client = new Browser($loop);

$result1 = $client->get('http://google.com/');
$result2 = $client->get('https://github.com/reactphp');

$loop->run();
0 vòng lặp đó. Đây là điều làm cho mã PHP này không đồng bộ. Ở dòng cuối cùng, chương trình không thoát mà bắt đầu nghe các sự kiện. Chúng tôi đã thực hiện hai yêu cầu mạng đồng thời, do đó chúng tôi cần đợi phản hồi. Hơn nữa, hướng dẫn này thực sự không gửi bất kỳ yêu cầu mạng nào



$result1 = $client->get('http://google.com/');

Chúng tôi chỉ mô tả ý định gửi yêu cầu. Chỉ khi vòng lặp bắt đầu chạy, yêu cầu mới được gửi. Đợi đã… nếu yêu cầu không được gửi… thì giá trị nào bên trong



use React\Http\Browser;
use Psr\Http\Message\ResponseInterface;

$loop = React\EventLoop\Factory::create();
$client = new Browser($loop);

$result1 = $client->get('http://google.com/');
$result2 = $client->get('https://github.com/reactphp');

$loop->run();
1 và


use React\Http\Browser;
use Psr\Http\Message\ResponseInterface;

$loop = React\EventLoop\Factory::create();
$client = new Browser($loop);

$result1 = $client->get('http://google.com/');
$result2 = $client->get('https://github.com/reactphp');

$loop->run();
0? . Coi lời hứa như một trình giữ chỗ cho một giá trị trong tương lai. Các lời hứa cơ bản sẽ giải quyết với các phản hồi nhận được sau khi yêu cầu mạng hoàn tất


$printResponse = fn (ResponseInterface $response) => var_dump((string)$response->getBody());

$promise1 = $client->get('http://google.com/');
$promise2 = $client->get('https://github.com/reactphp');

$promise1->then($printResponse);
$promise2->then($printResponse);

Tôi có thể thêm trình xử lý cho những lời hứa này và in phản hồi ngay khi có sẵn. Làm thế nào nó hoạt động đằng sau hậu trường? . Chúng tôi bắt đầu hai tác vụ không chặn I/O và yêu cầu HĐH thực hiện các yêu cầu mạng này cho chúng tôi. Đó là nó. Sau đó, luồng thực thi có thể làm một việc khác. Chúng tôi đã bắt đầu những nhiệm vụ này và không đợi cho đến khi chúng hoàn thành. Khi hệ điều hành đã nhận được phản hồi của mạng, nó sẽ gửi cho chúng tôi một sự kiện với dữ liệu đã nhận được. Một bản ghi của sự kiện này được thêm vào hàng đợi sự kiện. Chuỗi thực thi lấy sự kiện đầu tiên từ hàng đợi và gọi trình xử lý tương ứng cho sự kiện này. Trong trường hợp của chúng tôi, chúng tôi đã thêm cùng một trình xử lý cho cả hai tác vụ – in nội dung phản hồi

Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Phần kết luận

Tất cả những điều này cùng nhau. PHP đơn luồng, non-blocking I/O với kiến ​​trúc hướng sự kiện có thể dễ dàng làm cho PHP không đồng bộ. Có, hiện tại không có hỗ trợ cấp cao riêng cho ngôn ngữ này, nhưng có những thư viện có thể giúp chúng tôi. Hơn nữa, PHP có thể sử dụng ngay lập tức không đồng bộ mà không cần bất kỳ phần mở rộng bổ sung nào. Hiện tại, vấn đề chính là thiếu hỗ trợ riêng cho các chức năng trừu tượng và I/O cấp cao. Chúng ta đã sống trong mô hình yêu cầu-đáp ứng trong nhiều năm. Và do đó, phần lớn các thư viện mà chúng tôi có dự định hoạt động trong môi trường ngăn chặn. Nhưng, chúng ta cũng thấy rằng ngôn ngữ phát triển rất nhanh. Rất có thể chúng ta sẽ sớm thấy các bước đầu tiên để hỗ trợ riêng cho mã không đồng bộ trong PHP (hãy nói “xin chào” với các sợi)

Sự khác biệt giữa không đồng bộ và đồng bộ trong PHP là gì?

Mục đích của bài viết này không phải để nói với bạn rằng bạn có thể viết bất cứ thứ gì trên PHP. Tất nhiên, không có viên đạn bạc nào và các nhiệm vụ khác nhau yêu cầu các công cụ khác nhau. Là một nhà phát triển, bạn có quyền quyết định xem PHP có phù hợp với nhiệm vụ của mình hay bạn cần một ngôn ngữ khác. Tôi muốn giải thích cách hoạt động của PHP không đồng bộ. Rằng không có phép thuật nào bên trong và PHP không đồng bộ đó thực sự là không đồng bộ. Không bắt buộc phải có nhiều luồng để chạy mã đồng thời. Hơn nữa, nếu chúng ta đang nói về PHP thì đơn luồng là một lợi thế ở đây chứ không phải là hạn chế

Sự khác biệt giữa không đồng bộ và đồng bộ là gì?

Đồng bộ = xảy ra cùng lúc. Không đồng bộ = không xảy ra cùng lúc .

Sự khác biệt giữa lập trình đồng bộ và không đồng bộ là gì?

Trong khi xử lý đồng bộ được thực hiện tuần tự và theo một thứ tự cụ thể, thì quá trình xử lý không đồng bộ được thực hiện song song . Các nhiệm vụ không phụ thuộc vào người khác có thể được giảm tải và thực hiện cùng lúc với hoạt động chính và sau đó báo cáo lại kết quả khi chúng được thực hiện.

Sự khác biệt giữa dịch vụ đồng bộ hóa và không đồng bộ là gì?

Trình xử lý đồng bộ không trả về cho đến khi xử lý xong yêu cầu HTTP mà nó được gọi. Trình xử lý không đồng bộ giúp bạn chạy một quy trình độc lập với việc gửi phản hồi cho người dùng. Người dùng cần đợi cho đến khi quá trình gửi kết thúc trước khi nhận được phản hồi từ máy chủ

Ví dụ đồng bộ và không đồng bộ là gì?

Trong bối cảnh giao tiếp, nói chuyện với ai đó trực tiếp, qua điện thoại hoặc qua trò chuyện video đều được coi là đồng bộ vì chúng xảy ra cùng nhau và đồng thời. Mặt khác, email là một hình thức liên lạc không đồng bộ