πŸ“•[μ±…] 쏙쏙 λ“€μ–΄μ˜€λŠ” ν•¨μˆ˜ν˜• μ½”λ”© - 41,42

rivolt0421Β·2023λ…„ 5μ›” 7일
0

πŸ“•μ±…

λͺ©λ‘ 보기
23/26

469p ~ 490p

μš”μ•½

λ‹€μ‹œλ³΄λŠ” 쒋은 νƒ€μž„λΌμΈμ˜ 원칙

  1. 전체 νƒ€μž„λΌμΈμ˜ κ°œμˆ˜κ°€ μ μ„μˆ˜λ‘ μ΄ν•΄ν•˜κΈ° 쉽닀.

  2. νƒ€μž„λΌμΈ λ‚΄ λ‹¨κ³„μ˜ κ°œμˆ˜κ°€ μ μ„μˆ˜λ‘ μ΄ν•΄ν•˜κΈ° 쉽닀.

  3. κ³΅μœ ν•˜λŠ” μžμ›μ΄ μ μ„μˆ˜λ‘ μ΄ν•΄ν•˜κΈ° 쉽닀.

  4. μžμ›μ„ κ³΅μœ ν•œλ‹€λ©΄ μ„œλ‘œ μ‘°μœ¨ν•΄μ•Ό ν•œλ‹€.

    • νƒ€μž„λΌμΈμ€ 곡유 μžμ›μ„ μ•ˆμ „ν•˜κ²Œ κ³΅μœ ν•  수 μžˆμ–΄μ•Ό ν•œλ‹€.
    • μ•ˆμ „ν•˜κ²Œ κ³΅μœ ν•œλ‹€ === μ˜¬λ°”λ₯Έ μˆœμ„œλŒ€λ‘œ μžμ›μ„ μ“°κ³  λŒλ €μ€€λ‹€.
  5. μ‹œκ°„μ„ μΌκΈ‰μœΌλ‘œ 닀룬닀.

Queue() λ₯Ό 톡해 곡유 μžμ› μ‘°μœ¨ν•˜κΈ°

μžμ›μ„ κ³΅μœ ν•˜λŠ” "μ•‘μ…˜"듀이 μ‹€ν–‰λ˜λŠ” μˆœμ„œλ₯Ό κ³ λ €ν•˜λŠ” 과정이닀.

  • 쑰율 μ „ μ½”λ“œ
function add_item_to_cart(item) {
  cart = add_item(cart, item);
  calc_cart_total(cart, update_total_dom);
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}
  • νμ—μ„œ μ²˜λ¦¬ν•  μž‘μ—…μ„ 큐에 λ„£κ³ , 첫 번째 ν•­λͺ©μ„ μ‹€ν–‰ν•˜κΈ°
function add_item_to_cart(item) {
  cart = add_item(cart, item);
  update_total_queue(cart);		// action
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}

var queue_items = [];

function runNext() {
  var cart = queue_items.shift();
  calc_cart_total(cart, update_total_dom);
}

function update_total_queue(cart) {		// action
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • 두 번째 νƒ€μž„λΌμΈμ΄ 첫 번째 νƒ€μž„λΌμΈκ³Ό λ™μ‹œμ— μ‹€ν–‰λ˜λŠ” 것 막기

function add_item_to_cart(item) {
  cart = add_item(cart, item);
  update_total_queue(cart);
}

function calc_cart_total(cart, callback) {
  var total = 0;
  cost_ajax(cart, function(cost) {
    total += cost;
    shipping_ajax(cart, function(shipping) {
      total += shipping;
      callback(total);
    });
  });
}

var queue_items = [];
var working = false;	////

function runNext() {
  if(working)			////
    return;				////
  working = true;		////
  var cart = queue_items.shift();
  calc_cart_total(cart, update_total_dom);
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • λ‹€μŒ μž‘μ—…μ„ μ‹œμž‘ν•  수 μžˆλ„λ‘ 고치기.
var queue_items = [];
var working = false;

function runNext() {
  if(working)
    return;
  working = true;
  var cart = queue_items.shift();
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    working = false;	////
    runNext();			////
  });
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • 큐가 λΉ„μ—ˆμ„ λ•Œ λ©ˆμΆ”κ²Œ ν•˜κΈ°
var queue_items = [];
var working = false;

function runNext() {
  if(working)
    return;
  if(queue_items.length === 0)	////
    return;						////
  working = true;
  var cart = queue_items.shift();
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    working = false;
    runNext();
  });
}

function update_total_queue(cart) {
  queue_items.push(cart);
  setTimeout(runNext, 0);
}
  • λ³€μˆ˜μ™€ ν•¨μˆ˜λ₯Ό ν•¨μˆ˜ λ²”μœ„ μ•ˆμ— λ„£κΈ°
function Queue() {		////
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var cart = queue_items.shift();
    calc_cart_total(cart, function(total) {
      update_total_dom(total);
      working = false;
      runNext();
    });
  }

  return function(cart) {		////
    queue_items.push(cart);
    setTimeout(runNext, 0);
  };
}

var update_total_queue = Queue();	////
  • Queue() μ½”λ“œλ₯Ό μΌλ°˜ν™” - "ν•¨μˆ˜ 본문을 콜백으둜 λ°”κΎΈκΈ°" λ¦¬νŒ©ν„°λ§.
function Queue(worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var cart = queue_items.shift();
    worker(cart, function() {		//// done()
      working = false;
      runNext();
    });
  }

  return function(cart) {
    queue_items.push(cart);
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {		////
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);	//// done()
  });
}

var update_total_queue = Queue(calc_cart_worker);
  • μž‘μ—…μ΄ 끝났을 λ•Œ μ‹€ν–‰ν•˜λŠ” μ½œλ°±μ„ λ°›μ•„μ„œ μ‹€ν–‰ν•˜κΈ°. (queue 자체의 μž‘λ™μ„ μœ„ν•œ λ™μž‘μ„ ν¬ν•¨μ‹œμΌœμ„œ.)
function Queue(worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var item = queue_items.shift();
    worker(item.data, function(val) {			////
      working = false;
      setTimeout(item.callback, 0, val);		////
      runNext();
    });
  }

  return function(data, callback) {
    queue_items.push({
      data: data,								////
      callback: callback || function(){}		////
    });
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);
  });
}

var update_total_queue = Queue(calc_cart_worker);
  • μœ„μ˜ 큐가 λ„ˆλ¬΄ 느릴 λ•Œ μ“°λŠ” droppingQueue()
/// Dropping Queue

function DroppingQueue(max, worker) {
  var queue_items = [];
  var working = false;

  function runNext() {
    if(working)
      return;
    if(queue_items.length === 0)
      return;
    working = true;
    var item = queue_items.shift();
    worker(item.data, function(val) {
      working = false;
      setTimeout(item.callback, 0, val);
      runNext();
    });
  }

  return function(data, callback) {
    queue_items.push({
      data: data,
      callback: callback || function(){}
    });
    while(queue_items.length > max)
      queue_items.shift();
    setTimeout(runNext, 0);
  };
}

function calc_cart_worker(cart, done) {
  calc_cart_total(cart, function(total) {
    update_total_dom(total);
    done(total);
  });
}

var update_total_queue = DroppingQueue(1, calc_cart_worker);

정리

  • Queue() λŠ” ν•¨μˆ˜λ₯Ό 인자둜 λ°›μ•„ 또 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜μ΄λ‹€.
  • Queue() λŠ” μ–΄λ–€ ν•¨μˆ˜λ₯Ό μƒˆλ‘œμš΄ νƒ€μž„λΌμΈμ—μ„œ μ‹€ν–‰ν•˜κ³  ν•œ λ²ˆμ— ν•œ νƒ€μž„λΌμΈλ§Œ μ‹€ν–‰ν•  수 μžˆλ„λ‘ λ§Œλ“€μ–΄μ£ΌλŠ” κ³ μ°¨ν•¨μˆ˜μ΄λ‹€.
  • Queue() λŠ” μ•‘μ…˜μ— 'μˆœμ„œ 보μž₯' μŠˆνΌνŒŒμ›Œλ₯Ό μ£ΌλŠ” 도ꡬ이닀.
  • Queue() λŠ” λ™μ‹œμ„± κΈ°λ³Έν˜•(concurrency primitive) 이닀.

발췌

πŸ’‘ κ³΅μœ ν•˜λŠ” 방법을 ν˜„μ‹€μ—μ„œ μ°©μ•ˆν•˜κΈ°
인간은 μ–Έμ œλ‚˜ μžμ›μ„ κ³΅μœ ν•œλ‹€. 이λ₯Ό μ°©μ•ˆν•˜μ—¬, μ»΄ν“¨ν„°μ—κ²Œλ„ μΈκ°„μ˜ 방법과 λΉ„μŠ·ν•˜κ²Œ μžμ›μ„ κ³΅μœ ν•  수 μžˆλ„λ‘ ν”„λ‘œκ·Έλž˜λ° ν•  수 μžˆλ‹€.
ν˜„μ‹€μ—μ„œ μ–΄λ–€ 일이 μˆœμ„œλŒ€λ‘œ μ§„ν–‰λ˜κ²Œ ν•˜λŠ” λ°©λ²•μ˜ ν•˜λ‚˜λŠ” 쀄을 μ„œλŠ” 것 -> queueλ₯Ό λ§Œλ“€μ–΄ 컴퓨터가 μž‘μ—…μ„ μˆœμ„œλŒ€λ‘œ μ§„ν–‰ν•˜κ²Œ ν•˜λ„λ‘ ν•œλ‹€.

λ‹€λ₯Έ 예
1. ν•œ λ²ˆμ— ν•œ λͺ…μ”© μ“Έ 수 있게 ν™”μž₯μ‹€ 문을 μž κΈ€ 수 μžˆλ‹€.
2. 곡곡 λ„μ„œκ΄€μ€ μ§€μ—­μ‚¬νšŒκ°€ λ§Žμ€ 책을 κ³΅μœ ν•  수 μžˆλŠ” 곳이닀.
3. μΉ νŒμ„ μ‚¬μš©ν•˜λ©΄ μ„ μƒλ‹˜(기둝자) ν•œλͺ…이 ꡐ싀 전체(μ—΄λžŒμž)에 정보λ₯Ό κ³΅μœ ν•  수 μžˆλ‹€.

λ™μ‹œμ„± κΈ°λ³Έν˜•(concurrency primitive)은 μžμ›μ„ μ•ˆμ „ν•˜κ²Œ κ³΅μœ ν•  수 μžˆλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό λ§ν•©λ‹ˆλ‹€.

λ©”λͺ¨

점점 남은 νŽ˜μ΄μ§€κ°€ 쀄어듀고 μžˆλ‹€.

profile
I think I think too much.

0개의 λŒ“κΈ€