Concurrency
Concurrency
6 Sheet
Di Laravel 11, fitur Concurrency membantu mempercepat proses yang melibatkan beberapa tugas berat dengan menjalankannya secara paralel atau bersamaan. Dengan Concurrency, Anda dapat menjalankan beberapa operasi, seperti menjalankan beberapa query database atau tugas-tugas latar belakang, secara bersamaan dan secara berurutan. Ini sangat membantu dalam waktu eksekusi bisa dipersingkat secara signifikan dengan pemrosesan paralel, seperti mengambil data dari beberapa sumber sekaligus atau mengelola batch besar tugas asinkron.
Untuk menggunakan fitur ini, Anda bisa membuat serangkaian closure atau fungsi yang dijalankan dalam waktu bersamaan. Laravel akan menjalankan fungsi-fungsi ini dalam worker CLI proses yang terpisah, mengembalikan hasilnya dalam urutan yang Anda tentukan setelah semua proses selesai. Laravel 11 menyediakan tiga opsi driver untuk Concurrency:
-
Process (default)- menjalankan closure di proses CLI terpisah. -
Fork- meningkatkan kinerja dengan menjalankan di proses yang dipisah denganforking. -
Sync- menjalankan tugas secara berurutan (berguna untuk testing).
Fitur ini sangat bermanfaat untuk beban kerja yang panjang, namun penggunaannya harus disesuaikan dengan kebutuhan aplikasi Anda dan lingkungan pengembangannya, seperti testing dan produksi
Set Driver
anda bisa menggunakan driver tertentu sesuai yang anda butuhkan
Concurrency::driver('process')->run(); // driver defaultConcurrency::driver('fork')->run();Concurrency::driver('sync')->run();atau anda bisa publish concurrency pada config
php artisan config:publish concurrencyakan ada file baru di config/concurrency.php
return [ /* |-------------------------------------------------------------------------- | Default Concurrency Driver |-------------------------------------------------------------------------- | | This option determines the default concurrency driver that will be used | by Laravel's concurrency functions. By default, concurrent work will | be sent to isolated PHP processes which will return their results. | | Supported: "process", "fork", "sync" | */ 'default' => env('CONCURRENCY_DRIVER', 'process'), ];setup di file .env sehingga anda mudah mengganti driver melalui .env
... CONCURRENCY_DRIVER=process ...Pengujian Menggunakan Concurrency
membuat data factory User sebanyak 10 ribu
php artisan tinker User::factory()->count(10000)->create();buat view
php artisan make:view homebuat kode seperti berikut di controller atau di route:
Route::get('/', function () { [$users, $deleteUsers] = Concurrency::run([ fn() => User::get(), fn() => User::onlyTrashed()->get(), ]); return view('home', [ 'users' => $users, 'deleteUsers' => $deleteUsers ]);});pada view home
<div> <div>{{ $users->count() }}</div> <div>{{ $deleteUsers->count() }}</div></div>install Laravel Debugbar pada link berikut disini
composer require barryvdh/laravel-debugbar --devmaka hasil dari debugbar terlihat seperti berikut:

terlihat
Queries: 3yang digunakan denganMemory Usage: 149 MBdanRequest Duration: 1.41s
Pengujian Tanpa Conccurency
Route::get('/', function () { $users = User::get(); $deleteUsers = User::onlyTrashed()->get(); return view('home', [ 'users' => $users, 'deleteUsers' => $deleteUsers ]);});
terlihat
Queries: 5yang digunakan denganMemory Usage: 22 MBdanRequest Duration: 246ms
Kesimpulan
- Concurrency (Eksekusi Paralel)
Dalam kasus concurrency di atas, Concurrency memproses sejumlah data secara paralel. Ini dapat membantu menurunkan jumlah query yang dilakukan (karena beberapa operasi dapat digabungkan), tetapi biasanya akan membutuhkan lebih banyak memori, seperti yang terlihat dalam hasil Anda:
- Queries: 3
- Memory Usage: 149 MB
- Request Duration: 1.41s
Namun, meskipun waktu eksekusi lebih lama, concurrency bisa menghemat jumlah query yang dieksekusi, sehingga mengurangi beban kerja database dengan menyatukan proses. Tetapi, peningkatan penggunaan memori terjadi karena beberapa data dimuat sekaligus.
- Non-Concurrency (Tanpa Eksekusi Paralel)
Dalam mode non-concurrency, data diproses satu per satu atau dalam batch kecil. Ini mengurangi penggunaan memori karena data dimuat dan diproses lebih sedikit sekaligus, tetapi jumlah query meningkat:
- Queries: 5
- Memory Usage: 22 MB
- Request Duration: 246ms
Dalam hal ini, beban kerja untuk database lebih besar karena ada lebih banyak query yang harus dieksekusi. Namun, konsumsi memori jauh lebih rendah karena tidak ada data yang dimuat secara paralel.
Komentar
Ada 0 komentar pada episode ini.