Lập trình bất đồng bộ, ta hiểu theo nghĩa đen, có thể hiểu là code được thực thi không đồng bộ. Lập trình không đồng bộ có thể được quy cho bốn chế độ. gọi lại, trình lắng nghe sự kiện, xuất bản/đăng ký, chế độ lời hứa. Hai chế độ mà chúng ta quen thuộc nhất là gọi lại và xử lý sự kiện, đưa ra hai ví dụ javascript đơn giản nhất, ajax và liên kết sự kiện nhấp chuột
$.getJSON["uri", params, function[result] {
do_something_with_data[result];
}];$["#id"].click[function[]{
do_something_when_user_click_id[];
}];
Đặc điểm chung của 2 ví dụ trên là hàm này được truyền dưới dạng tham số cho hàm khác. Hàm được truyền có thể được gọi là một bao đóng và việc thực thi bao đóng phụ thuộc vào thời điểm hàm cha gọi nó
Ưu điểm và nhược điểm Lập trình không đồng bộ có những ưu điểm sau- Tách rời, bạn có thể tách logic nghiệp vụ phức tạp thành nhiều logic xử lý sự kiện thông qua liên kết sự kiện
- Đồng thời, kết hợp với IO không chặn, cho phép truy cập đồng thời vào IO trong một quy trình [hoặc luồng];
- Hiệu quả, trong trường hợp không có cơ chế sự kiện, chúng ta thường cần sử dụng tính năng bỏ phiếu để xác định xem một sự kiện có được tạo hay không
Nhược điểm của lập trình không đồng bộ thực sự rõ ràng - lồng gọi lại. Tôi tin rằng một số người đã gặp phải cảnh như vậy khi viết ajax
$.getJSON["uri", params, function[result_1] {
$.getJSON["uri", result_1, function[result_2] {
$.getJSON["uri", result_2, function[result_3] {
do_something_with_data[result_3];
}];
}];;
}];
Điều này thường được thực hiện do các vấn đề phụ thuộc vào dữ liệu, yêu cầu ajax thứ hai phụ thuộc vào việc trả lại yêu cầu đầu tiên và ajax thứ ba phụ thuộc vào yêu cầu thứ hai. Điều này gây ra lồng gọi lại sâu và khả năng đọc mã giảm đáng kể. Mặc dù có một số khung có thể giải quyết các vấn đề như vậy thông qua một số mẫu, nhưng khả năng đọc mã vẫn kém hơn nhiều so với cách viết đồng bộ
Một nhược điểm khác của lập trình không đồng bộ là quá trình viết và gỡ lỗi phức tạp hơn. Đôi khi bạn không biết khi nào các hàm của mình sẽ được gọi và thứ tự chúng được gọi. Và chúng ta đã quen với lập trình nối tiếp đồng bộ hơn
Tuy nhiên, tôi tin rằng một khi bạn bắt đầu sử dụng lập trình bất đồng bộ, bạn sẽ thích cách tiếp cận này vì nó sẽ mang lại cho bạn nhiều tiện ích hơn
Trong ngôn ngữ php, việc sử dụng bất đồng bộ không nhiều như trong javascript. Lý do chính là php thường hoạt động trong môi trường web, nhận yêu cầu -> đọc dữ liệu -> tạo trang, bản chất có vẻ là nối tiếp. Quá trình;
Chế độ lập trình không đồng bộ trong 4 trong javascript có thể được thực hiện trong php
array_walk[$arr, function[$key, $value]{
$value += 1;
}];
print_r[$arr];
Trong trường hợp gọi lại, trong hầu hết các trường hợp, mã vẫn được thực thi tuần tự [thứ tự array_walk->print_r]. Ý nghĩa của hàm gọi lại là người qua đường có thể gọi hàm gọi lại để xử lý dữ liệu, có ưu điểm là cung cấp khả năng mở rộng và tách rời tốt hơn. Ta có thể hiểu callback function này như một formatter xử lý dữ liệu giống nhau. Khi tôi vượt qua bộ lọc json, kết quả trả về có thể là chuỗi nén json, khi tôi vượt qua bộ lọc xml. Kết quả trả về có thể là một chuỗi xml [ý tưởng hơi đa hình]
Giám sát sự kiện [bộ đếm thời gian, sự kiện thời gian].$loop = React\EventLoop\Factory::create[];
$loop->addPeriodicTimer[5, function [] {
$memory = memory_get_usage[] / 1024;
$formatted = number_format[$memory, 3].'K';
echo "Current memory usage: {$formatted}\n";
}];
$loop->run[];
Trình xử lý sự kiện không được sử dụng nhiều trong PHP, nhưng không phải không có, chẳng hạn như pcntl_signal[] lắng nghe tín hiệu hệ điều hành và theo dõi các sự kiện IO khác. Ví dụ trên là một trình lắng nghe các sự kiện sự kiện và chức năng gọi lại được thực thi cứ sau 5 giây
Trong bốn chế độ không đồng bộ, ứng dụng giám sát sự kiện có ý nghĩa hơn. Tuy nhiên, hãy xem một ví dụ đồng bộ. Đoạn mã sau được sử dụng để gửi yêu cầu tới Yahoo và Google [một trang web không tồn tại]. Quá trình đồng bộ hóa được viết bằng cách yêu cầu Yahoo hoặc Google trước và chờ yêu cầu kết thúc trước khi yêu cầu khác
$http = new HTTP[];
echo $http->get[ '//www.yahoo.com' ];
echo $http->get[ '//www.google.com' ];
Xử lý dựa trên sự kiện có thể như thế này
$http = new HTTP[];
$http->get [ 'www.yahoo.com' ];
$http->get [ 'www.bing.com' ];
$http->on['response', function[$response]{
echo $response . PHP_EOL;
}];
$http->run[];
Viết không đồng bộ cho phép chúng tôi xử lý nhiều giao dịch cùng một lúc. Ai xử lý trước thì xử lý ai xử lý trước. Một máy khách http không đồng bộ đơn giản nhìn thấy. không đồng bộ-http-php
PHP có một số tiện ích mở rộng và gói cung cấp hỗ trợ cho việc này
Tiện ích mở rộng libevent ex-libevent, dựa trên thư viện libevent, hỗ trợ các sự kiện thời gian và IO không đồng bộ
Tiện ích mở rộng sự kiện ngoài sự kiện, hỗ trợ cho các sự kiện thời gian và IO không đồng bộ
Tiện ích mở rộng libev Ext-libev, dựa trên thư viện libev, hỗ trợ các sự kiện thời gian và IO không đồng bộ
Tiện ích mở rộng ex-eio eio, dựa trên thư viện eio, hỗ trợ hoạt động của đĩa không đồng bộ
Ext-swoole swoole mở rộng, hỗ trợ IO không đồng bộ và thời gian, máy chủ socket không đồng bộ dễ viết, khuyến nghị
Gói phản ứng gói-phản ứng cung cấp lập trình không đồng bộ toàn diện, bao gồm IO, sự kiện thời gian, đĩa IO, v.v.
Package-worker gói worker, tương tự như swoole, php
Theo dõi công khai.$lookup = new nsqphp\Lookup\Nsqlookupd;
$nsq = new nsqphp\nsqphp[$lookup];
$nsq->subscribe['mytopic', 'somechannel', function[$msg] {
echo $msg->getId[] . "\n";
}]->run[];
Lời hứa. function getJsonResult[]
{
return queryApi[]
->then[
// Transform API results to an object
function [$jsonResultString] {
return json_decode[$jsonResultString];
},
// Transform API errors to an exception
function [$jsonErrorString] {
$object = json_decode[$jsonErrorString];
throw new ApiErrorException[$object->errorMessage];
}
];
}
// Here we provide no rejection handler. If the promise returned has been
// rejected, the ApiErrorException will be thrown
getJsonResult[]
->done[
// Consume transformed object
function [$jsonResultObject] {
// Do something with $jsonResultObject
}
];
Ý nghĩa của chế độ lời hứa là tách rời. Vấn đề lồng nhau gọi lại không đồng bộ mà chúng tôi vừa đề cập có thể được giải quyết bằng lời hứa. Nguyên tắc là trong mỗi lần truyền hàm gọi lại, bạn sẽ nhận được một đối tượng promie và đối tượng này có một phương thức then, phương thức đó vẫn có thể trả về một đối tượng lời hứa, bạn có thể đạt được sự tách biệt của nhiều lớp bằng cách truyền đối tượng lời hứa. . Code cụ thể cần nghiên cứu mã nguồn hơi khó hiểu, PHP nên đọc. hứa
Nguyên tắc thực hiện không đồng bộViệc triển khai không đồng bộ thường có các sự kiện trình nghe vòng lặp. Ví dụ, chúng ta thấy $loop->run[] ở trên, đây thực sự là một vòng lặp vô hạn. Khi sự kiện được lắng nghe, trình xử lý tương ứng được gọi. Bác nào rành về pcntl thì phải biết khai báo [tick=1], thực chất nó cũng là một vòng lặp, nghĩa là mỗi lần thực hiện code dòng tick kiểm tra xem có tín hiệu nào chưa xử lý không. Mặc dù sẽ có một vòng lặp chặn [trong hầu hết các trường hợp, khai báo là trường hợp đặc biệt], nhưng chúng ta có thể lắng nghe nhiều sự kiện và có thể dừng vòng lặp trong quá trình xử lý sự kiện nhất định, để truy cập IO không đồng bộ đồng thời, thậm chí nhiều hơn
Một mã giả như sau
________số 8_______Toàn bộ bài viết thực sự không đủ chi tiết. Tốt nhất, nó là một bài viết giới thiệu, là một bản tóm tắt về lập trình không đồng bộ của tôi. Học lập trình bất đồng bộ không đơn giản như học một ngôn ngữ hay mẫu thiết kế. Nó đòi hỏi chúng ta phải thay đổi cách lập trình truyền thống. IO không đồng bộ cũng cao hơn một chút đối với người học. Trước tiên, bạn phải làm quen với các hoạt động IO đồng bộ hoặc thậm chí bạn cần hiểu một số phân tích cú pháp giao thức
Tôi hy vọng nội dung trên sẽ giúp một số người mới bắt đầu. Nếu có gì sai trong văn bản, tôi vẫn hy vọng sửa chữa nó