Avatar
0
monkey Enlightened
monkey Enlightened
Các dạng của event loop
Có mấy dạng của event loop?
  • Answer
multi-threading
Remain: 5
2 Answers
Avatar
monkey Enlightened
monkey Enlightened
Có 2 dạng của event loop:

  1. Sử dụng blocking queue:

while(true) {
    Request request = blockingQueue.take();
}

Ưu điểm:

  • Không phải mất thời gian sleep, khi có request gửi đến là có thể lấy ra xử lý luôn
  • Đối với các trường hợp cần kiểm tra max capacity sẽ rất tiện

Nhược điểm:

  • Mỗi lần chỉ lấy ra được request để xử lý
  • Không thể thực hiện 1 việc gì đó định kỳ do bị block nếu queue rỗng
  • Không thể handle nhiều queue cùng 1 lúc

  1. Sử dụng queue thường

List buffer = new ArrayList();
while(true) {
    doSomething();
    if(synchronizedQueue.isEmpty()) {
        Thread.sleep(time);
    } else {
         buffer.clear();
         buffer.addAll(synchronizedQueue);
         processBatchRequests(buffer);
    }
    processQueue2(queue2);    
}

Ưu điểm:

  • Có thể lấy ra nhiều request để xử lý 1 lúc
  • Có thể thực hiện 1 việc gì đó định kỳ: Cái này phù hợp cho các framework client, khi luôn phải được gọi định kỳ để thông báo cho các hàm async và update state để hiển thị UI

Nhược điểm:

  • Bị sleep một khoảng thời gian, trong lúc đó hoàn toàn có thể đã có request đến và nó không được xử lý ngay.
  • Nếu muốn kiểm tra max capacity queue vẫn được, tuy nhiên do bị delay việc xử lý nên việc kiểm tra này không chính xác tuyệt đối.

Như vậy với các ứng dụng server, nơi phải ưu tiên việc xử lý request thì nên chọn phương án 1 blocking queue vì server cũng có thể tạo nhiều thread.

Đối với các ứng dụng client thì nên chọn phương án 2 vì phải định kỳ thông báo cho các hàm async và state để update UI, thêm nữa client cũng hạn chế thread, nên có thể sử dụng 1 thread duy nhất để loop tất cả các queue.

Đối với ezyfox-server có hỗ trợ cơ chế anti-flooding để chống DDoS nên cần kiểm tra max queue capacity thì phương án 1 lại càng cần thiết hơn.

  • 0
  • Reply
Avatar
anaconda875 Enlightened
anaconda875 Enlightened
Cho e hỏi thêm chỗ Thread.sleep(time);

time bao nhiêu là hợp lý a nhỉ? giả sử e có 4 thread event loop, 1k thread, 100k thread

  • 0
  • Reply
Khoảng 3 millis là hợp lý em ạ  –  monkey 1672876971000