Chào cả nhà, lại là tôi đây, một lập trình viên trẻ tuổi có linh hồn già cỗi.
Mình là một người yêu PHP, và đã làm việc với Larvel hơn 20 năm rồi :D

Hôm nay thì chúng ta cùng nhau tìm hiểu một chút về Multithread trong PHP nhé ?
Chả liên quan :v.
Multithread là gì ?
Thread là gì ?
Thread là khái niệm hay thuật ngữ chỉ về luồng trong lập trình. Luồn ở đây tức là một tiến trình nhỏ hay còn gọi là tiến trình con, trong tiếng Anh là Sub-process.
Đây được biết đến là một đơn vị nhỏ nhất của máy tính được sử dụng để xử lý và thực hiện một công việc nào đó một cách riêng biệt.
=> Đa luồng giúp cho các tác vụ được xử lý độc lập giúp công việc được hoàn thành nhanh chóng. Vậy đa luồng có thể hiểu đơn giản là quá trình xử lý nhiều thread song song nhau và thực hiện các nhiệm vụ khác nhau cùng một lúc.
VD: Như khi thuyêt trình, tôi vừa nói, vừa khua tay múa chân, vừa nhìn khán giả xem ai có đang không chú ý nghe tôi nói ko ?
Thế nó khác mẹ gì với đa nhiệm ?
Thực ra nó là một
Nhưng cụ thể hơn trong khoa học máy tính thì nó lại khác
Đa luồng là thực hiện đồng thời nhiều luồng trong một tiến trình(process).
Đa nhiệm là thực hiện đồng thời nhiều tiến trình(processes) một lúc.
VD:
Nếu gọi việc bàn giao sản phẩm cho khách hàng là một tiến trình.
Một công ty có nhiều team phải làm nhiều sản phẩm để bàn giao cho khách hàng, ta nói đó là đa nhiệm.
Nếu ta tách bàn giao sản phẩm cho khách hàng ra thành nhiều việc nhỏ hơn: coding, testing, analysing ... thì những việc như này tôi sẽ gọi là luồng và khi một team thực hiện nhiều luồng như này cùng 1 lúc thì tôi gọi là đa luồng.
Một tiến trình (Process) là gì ?
Trước hết ta cần biết ai hơn ai ?

- Một process có thể chứa nhiều thread bên trong nó. Khi chúng ta chạy ứng dụng, hệ điều hành tạo ra một process và bắt đầu chạy các thread chính của process đó.
- Một điểm khác biệt nữa đó là nhiều thread nằm trong cùng một process dùng một không gian bộ nhớ giống nhau, trong khi process thì không. Điều này cho phép các thread đọc và viết cùng một kiểu cấu trúc và dữ liệu, giao tiếp dễ dàng giữa các thread với nhau. Giao thức giữa các process, hay còn gọi là IPC (inter-process communication) thì tương đối phức tạp bởi các dữ liệu có tính tập trung sâu hơn.
VD: Thì khi chúng ta lập trình đa luồng thì có thể dùng chung một biến cho các luồng khác nhau trong một tiến trình.
$arr = [2, 3, 4, 5];
// Luồng 1 sử dụng $arr
// Luồng 2 sử dụng $arrNếu chỉ có một chiếc PC cùi thì sao ?
- CPU thread: là thread trong Interl Core i3 4 cores 4 threads. Nó mang ý nghĩa luồng thực thi của CPU. Mỗi một processor (core) chỉ có khả năng xử lý duy nhất 1 luồng (thread).
- OS thread: là thread trong lập trình multi-thread. Là thread trong một process. Với các lập trình viên, khi nói đến thread, ta hiểu nó là OS thread.
Còn CPU có 2 core 4 thread, tức một core ( nhân vật lý ) chạy được thực thi 2 core ảo ( nhân ảo ) tức là chạy được 4 thread. Nhưng đấy là ở cấp độ máy tính chứ không phải là HĐH.
Vậy có phải với chiếc CPU này thì tôi chỉ làm được 4 việc cùng một lúc ?
=> Không nhé.
Mỗi thread của máy tính sẽ xử lý nhiều process của hệ điều hành. Nó sẽ không phải multiple như trong hệ điều hành mà là theo cấu trúc ngăn xếp. (Round Robin)
Rồi chúng ta sẽ liệt kê lại:
- 1 Core vật lý (Máy tính) chạy được 2 Thread (Máy tính)
- 1 Thread (Máy tính) chạy được nhiều Process (HDH) => Multitasking
- 1 Process (HDH) chạy được nhiều thread (HDH) => Multithread
Vậy chạy queue có phải là đang sử dụng Multithread
Như chúng ta đã biết hoặc chưa biết thì khi PHP (Laravel) xử lý một request đến và trả về response bằng một tiến trình (process) trên HDH.
Tức là:


Vậy nên trong quá trình đó mà có việc xử lý gủi mail chẳng hạn nó sẽ phải chạy tuần tự 1000 lần gửi mail mới ra được response cuối cùng đưa về màn hình.
Thời gian gửi mail thực sự là lâu hoặc trong quá trình đó có lỗi sẽ làm hỏng và không đưa lại response mong muốn.
=> Vậy thì ta đưa vào queue
Lúc này mỗi mail sẽ được xử lý như là một process đơn lẻ của thread (core) của CPU (Máy tính) vậy.
php mail_1.php
php mail_2.php
...
php mail_1000.phpVà nó được chạy độc lập không liên quan gì đến request kia nên request kia vẫn sẽ trả về response mong muốn và nhanh ko ảnh hưởng gì. Và có thể chúng ta có thể config cho nó chạy queue trên multithread trong process (HDH) cũng được. Về việc thành công hay lỗi trong từng tiến trình gửi mail kia sẽ được framework (Laravel, Symfony ...) cấu hình để thông báo cho chúng ta riêng biệt.
Kết luận
Như vậy qua các phần trên ta đã hiểu được queue và thread hoạt động như thế nào rồi, nó hoạt động trên một Thread ( nhân ảo ) hoặc 1 core ( nhân vật lý ) trên máy tính của bạn.