2 回答

蝴蝶刀刀
TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超8個(gè)贊
自從使用tornado以后就不再使用django了, tornado也從1.x到了現(xiàn)在3.x
Tornado之所以與眾不同, 是因?yàn)樗潜姸郬SGI框架中的一個(gè)特例. 它的異步方式也給了社區(qū)很多啟發(fā), 影響力很大.
單就非阻塞和多線程, 起到的都是"多任務(wù)"那種功能. 不同的是, 多線程把處理器時(shí)間按照任務(wù)平分, 非阻塞是按照事件來驅(qū)動(dòng)多任務(wù), 不會(huì)在一個(gè)任務(wù)沒有執(zhí)行完的時(shí)候打斷(沒有保存變量, 任務(wù)切換這種事情, 當(dāng)然也不需要加鎖)
至于哪個(gè)對web開發(fā)更重要? 寫出來的程序功能是一樣的. 如果是異步寫, 代碼會(huì)多一點(diǎn), 因?yàn)橛泻芏郼allback, 但是你完全無需處理多線程程序的共享資源問題, 無需數(shù)據(jù)庫連接池.
你需要小心不要寫出CPU占用太高的代碼, 因?yàn)镃PU不是按照時(shí)間平均分配給大家的, 如果你的程序處理一件事情需要兩秒鐘, 那么兩個(gè)線程的程序可能會(huì)同時(shí)跑, 總共5秒同時(shí)結(jié)束(1秒鐘用在任務(wù)切換).
如果是異步環(huán)境, 那么就是先執(zhí)行一個(gè)程序2秒, 然后再執(zhí)行另外一個(gè)程序2秒, 總共4.5秒(無需保存環(huán)境, 假設(shè)任務(wù)切換0.5秒)
對于那種CPU消耗極小的等待任務(wù), 比如同步的curl操作(服務(wù)器在等待另外一個(gè)服務(wù)器), 這等待的1秒鐘, 使用異步的話tornado已經(jīng)可以處理幾千個(gè)其他的http requests, 奇妙的是tornado這個(gè)時(shí)候還是工作在單線程模式, CPU幾乎完全沒有浪費(fèi).
實(shí)戰(zhàn)中, 其他框架需要在多進(jìn)程prefork模式下開到60-100個(gè)進(jìn)程的吞吐能力, tornado可能開1到3個(gè)進(jìn)程, 處理能力是類似的. 注意在多進(jìn)程模式下, cpu需要不斷切換60個(gè)進(jìn)程的壓力是不小的.
Tornado之所以與眾不同, 是因?yàn)樗潜姸郬SGI框架中的一個(gè)特例. 它的異步方式也給了社區(qū)很多啟發(fā), 影響力很大.
單就非阻塞和多線程, 起到的都是"多任務(wù)"那種功能. 不同的是, 多線程把處理器時(shí)間按照任務(wù)平分, 非阻塞是按照事件來驅(qū)動(dòng)多任務(wù), 不會(huì)在一個(gè)任務(wù)沒有執(zhí)行完的時(shí)候打斷(沒有保存變量, 任務(wù)切換這種事情, 當(dāng)然也不需要加鎖)
至于哪個(gè)對web開發(fā)更重要? 寫出來的程序功能是一樣的. 如果是異步寫, 代碼會(huì)多一點(diǎn), 因?yàn)橛泻芏郼allback, 但是你完全無需處理多線程程序的共享資源問題, 無需數(shù)據(jù)庫連接池.
你需要小心不要寫出CPU占用太高的代碼, 因?yàn)镃PU不是按照時(shí)間平均分配給大家的, 如果你的程序處理一件事情需要兩秒鐘, 那么兩個(gè)線程的程序可能會(huì)同時(shí)跑, 總共5秒同時(shí)結(jié)束(1秒鐘用在任務(wù)切換).
如果是異步環(huán)境, 那么就是先執(zhí)行一個(gè)程序2秒, 然后再執(zhí)行另外一個(gè)程序2秒, 總共4.5秒(無需保存環(huán)境, 假設(shè)任務(wù)切換0.5秒)
對于那種CPU消耗極小的等待任務(wù), 比如同步的curl操作(服務(wù)器在等待另外一個(gè)服務(wù)器), 這等待的1秒鐘, 使用異步的話tornado已經(jīng)可以處理幾千個(gè)其他的http requests, 奇妙的是tornado這個(gè)時(shí)候還是工作在單線程模式, CPU幾乎完全沒有浪費(fèi).
實(shí)戰(zhàn)中, 其他框架需要在多進(jìn)程prefork模式下開到60-100個(gè)進(jìn)程的吞吐能力, tornado可能開1到3個(gè)進(jìn)程, 處理能力是類似的. 注意在多進(jìn)程模式下, cpu需要不斷切換60個(gè)進(jìn)程的壓力是不小的.
- 2 回答
- 0 關(guān)注
- 1430 瀏覽
添加回答
舉報(bào)
0/150
提交
取消