協程和多線程的小例子
昨天看完協程相關的文章之後不是很理解,今天又仔細研讀了一遍相關文章,結合之前的代碼積累,感覺和完全弄懂相距「一層窗戶紙」。
so向聚聚問了下協程和多線程的問題,聚聚給我舉了這樣一個例子
<body><div id="foo">你點我啊</div><script src="static/js/jquery-1.11.0.min.js"></script><script>var lbar = (function() { var $dom = $(<div stylex="top: 0; left: 0; width: 100%; height: 2px; position: fixed; background: #ea8a47;"></div>); var $body = $(body); var count = 0; return { load: function() { $dom.stop(true, false).css({ left: -100%, opacity: 1 }); $body.append($dom); $dom.animate({ left: -20% }, 4000); count += 1; }, complete: function() { if (count === 1) { $dom.stop(true, false).animate({ left: 0% }, 200, function() { $dom.animate({ opacity: 0 }, 200, function() { $dom.remove().css(opacity, 1); }); }); } if (count > 0) { count -= 1; } } };})();$(#foo).click(function() { lbar.load(); setTimeout(function() { lbar.complete(); }, 1000);});</script></body>
讓我想想如果用多線程會有什麼問題。
ok ,首先讓我們來讀下代碼,#foo點擊之後會調取lbar.load()動畫開啟,使用setTimeout3秒之後調用結束函數,計數變數用來處理多次點擊重複關閉的情況,按照現在的邏輯來看,假設一秒鐘之內點擊了#foo三次,因為有計數變數的判斷,雖然協程調用了三次lbar.complete()但只關閉動畫一次,假設再加一個#xoo按鈕和#foo按鈕實現的功能一樣,也不會影響動畫的開始和關閉。
以上是按照js單線程協程的方式思考問題,下面讓我們用多線程思考問題:
要是使用多線程,再加一個線程#xoo按鈕和主線程#foo按鈕實現的功能一樣,那麼這兩個線程調用的都是主線程的開/關動畫函數,這樣計數count的值就不可估計了,什麼情況都有可能發生,比如主線程點擊一次,同時另一個線程也點擊,可能就會加兩次count變成3,線程休眠一秒之後誰快誰慢也不可估計,需要加入鎖的概念,讓後來的線程等待浪費大量的時間。
以上只是一個小例子,多線程和協程主要還是用在IO讀寫的時候差距比較明顯;
具體理論方面可以看下方正大大的這篇文章:
方正:事件驅動與協程:基本概念介紹後來聚聚又給我用rust寫了個例子:
才知道ownership原來是這麼用的。。rust還是處於了解階段,,還沒倒出時間好好學,有時間一定得多看看rust,拜拜
推薦閱讀:
※深入python協程的實現,帶你一層一層揭開協程的神秘面紗!
※老協程,新協程?
※python協程簡介
TAG:協程 |