Fakultas Ilmu Komputer UI

Skip to content
Snippets Groups Projects
Commit f5e82c28 authored by rafliesa's avatar rafliesa
Browse files

README.md

parent 29da2e5c
No related branches found
No related tags found
No related merge requests found
......@@ -9,9 +9,65 @@ Fungsi handle_connection berfungsi untuk menghandle koneksi TCP seperti HTTP req
3. `println!("Request: {:#?}", http_request);` Menampilkan isi HTTP request dalam format yang lebih mudah dibaca.
# Commit 2 Reflection Note:
![Deskripsi Gambar](asset/images/commit2.png)
1. Response yang sukses diindikasikan dengan string `"HTTP/1.1 200 OK"`.
2. Content berisi `hello.html` yang dibaca menggunakan `fs::read_to_string("hello.html").unwrap()`
3. Panjang dari konten ditentukan melalui dengan `contents.len()` untuk memastikan bahwa header `Content-Lenght` diatur dengan benar.
4. Response yang akan dikembalikan diformat menggunakan macro `format!`, lalu dikirim ke cient melalui `stream.write_all(response.as_bytes().unwrap()).
# Commit 3 Reflection Note:
1. Untuk melakukan seleksi pengiriman response, kita cukup menggunakan percabangan if-else. Yang membedakan antar kedua percabangan tersebut adalah status_line dan file_name.
2. Kita perlu melakukan refactoring karena yang membedakan kedua percabangan hanyalah status_line dan file_name. Sehingga pada kedua block percabangan tersebut, hanya boleh diisi dengan assigment ke variable status_line dan file_name. Hal ini membuat code menjadi lebih pendek, readable, dan bersih.
# Commit 4 Reflection Note:
Kita mensimulasikan slow response dengan menggunakan `thread::sleep(Duration:from_secs(10));`<br>
Permasalahan yang terjadi adalah, ketika kita membuka situs tersebut secara bersamaan menggunakan banyak browser (atau tab), proses load website tersebut menjadi saling tunggu. Website baru bisa melakukan proses setelah website sebelumnya berhasil terload. Hal tersebut terjadi karena kita hanya mengguakan single thread.
# Commit 5 Reflection Note:
Untuk mengatasi permasalahan yang terjadi pada Commit 4, kita perlu membuat program dapat berjalan secara paralel. Caranya adalah dengan menggunakan multithreading. Namun dalam prosesnya, kita tidak memunculkan atau membuat thread baru setiap kali proses baru berjalan, melainkan kita membuat `Thread Pool`, yaitu sekumpulan thread yang siap menjalanan proses baru yang dibuat, sehingga lebih efisien.
<br><br>
Pada implementasinya, kita menggunakan 2 struct utama yaitu `Thread Pool` dan `Worker`.
1. Thread Pool<br>
Thread Pool berfungsi untuk mengatur thread-thread yang akan digunakan. Thread Pool memiliki jumlah thread yang dimiliki sebagai argumen pada konstruktornya. <br>
```
let (sender, receiver) = mpsc::channel();
let receiver = Arc::new(Mutex::new(receiver));
```
1. `mpsc::channel()` membuat channel untuk komunikasi antar thread. <br>
2. `Arc + Mutex` berfungsi agar receiver bisa dibagikan ke banyak worker thread.
```
pub fn execute<F>(&self, f: F)
where
F: FnOnce() + Send + 'static,
{
let job = Box::new(f);
self.sender.send(job).unwrap();
}
```
1. Fungsi tersebut berfungsi untuk menerima closure f sebagai tugas yang akan diekekusi.
2. F dikemas(diwarp) dalam `FnOnce() + Send + 'static` agar bisa dikirim antar thread.
3. `self.send(job).unwrap();` digunakan untuk mengirim tugas ke worker melalui channel
2. Worker
Worker adalah thread yang akan melakukan suatu proses baru. Worker memiliki konstruktor sebagai berikut:
```
fn new(id: usize, receiver: Arc<Mutex<mpsc::Receiver<Job>>>) -> Worker {
let thread = thread::spawn(move || loop {
let job = receiver.lock().unwrap().recv().unwrap();
println!("Worker {id} got a job; executing.");
job();
});
Worker { id, thread }
}
```
1. Pada kode `receiver.lock().unwrap().recv().unwrap();`: <br>
1. `lock()` berfungsi untuk mengakses mutex untuk mendapatkan Receiver<Job>.
2. `recv()` berfungsi mengambil tugas dari channel (blocking, akan menunggu tugas).
3. `unwrap()` memunculkan panic jika ada error.
2. Perhatikan bahwa terdapat `loop` yang berarti Worker akan selalu menunggu tugas baru dari receiver.
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment