精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

JavaScript 異步編程指南 - 聊聊 Node.js 中的事件循環

開發 前端
事件循環是一種控制應用程序的運行機制,在不同的運行時環境有不同的實現,上一節講了瀏覽器中的事件循環,它們有很多相似的地方,也有著各自的特點,本節討論下 Node.js 中的事件循環。

[[430418]]

事件循環是一種控制應用程序的運行機制,在不同的運行時環境有不同的實現,上一節講了瀏覽器中的事件循環,它們有很多相似的地方,也有著各自的特點,本節討論下 Node.js 中的事件循環。

了解 Node.js 中的事件循環

Node.js 做為 JavaScript 的服務端運行時,主要與網絡、文件打交道,沒有了瀏覽器中事件循環的渲染階段。

在瀏覽器中有 HTML 規范來定義事件循環的處理模型,之后由各瀏覽器廠商實現。Node.js 中事件循環的定義與實現均來自于 Libuv。

Libuv 圍繞事件驅動的異步 I/O 模型而設計,最初是為 Node.js 編寫的,提供了一個跨平臺的支持庫。下圖展示了它的組成部分,Network I/O 是網絡處理相關的部分,右側還有文件操作、DNS,底部 epoll、kqueue、event ports、IOCP 這些是底層不同操作系統的實現。

圖片來源:http://docs.libuv.org/en/v1.x/_images/architecture.png

事件循環的六個階段

當 Node.js 啟動時,它會初始化事件循環,處理提供的腳本,同步代碼入棧直接執行,異步任務(網絡請求、文件操作、定時器等)在調用 API 傳遞回調函數后會把操作轉移到后臺由系統內核處理。目前大多數內核都是多線程的,當其中一個操作完成時,內核通知 Node.js 將回調函數添加到輪詢隊列中等待時機執行。

下圖左側是 Node.js 官網對事件循環過程的描述,右側是 Libuv 官網對 Node.js 的描述,都是對事件循環的介紹,不是所有人上來都能去看源碼的,這兩個文檔通常也是對事件循環更直接的學習參考文檔,在 Node.js 官網介紹的也還是挺詳細的,可以做為一個參考資料學習。

左側 Node.js 官網展示的事件循環分為 6 個階段,每個階段都有一個 FIFO(先進先出)隊列執行回調函數,這幾個階段之間執行的優先級順序還是明確的。

右側更詳細的描述了,在事件循環迭代前,先去判斷循環是否處于活動狀態(有等待的異步 I/O、定時器等),如果是活動狀態開始迭代,否則循環將立即退出。

下面對每個階段分別討論。

timers(定時器階段)

首先事件循環進入定時器階段,該階段包含兩個 API setTimeout(cb, ms)、setInterval(cb, ms) 前一個是僅執行一次,后一個是重復執行。

這個階段檢查是否有到期的定時器函數,如果有則執行到期的定時器回調函數,和瀏覽器中的一樣,定時器函數傳入的延遲時間總比我們預期的要晚,它會受到操作系統或其它正在運行的回調函數的影響。

例如,下例我們設置了一個定時器函數,并預期在 1000 毫秒后執行。

  1. const now = Date.now(); 
  2. setTimeout(function timer1(){ 
  3.   log(`delay ${Date.now() - now} ms`); 
  4. }, 1000); 
  5. setTimeout(function timer2(){ 
  6.  log(`delay ${Date.now() - now} ms`); 
  7. }, 5000); 
  8. someOperation(); 
  9.  
  10. function someOperation() { 
  11.   // sync operation... 
  12.   while (Date.now() - now < 3000) {} 

當調用 setTimeout 異步函數后,程序緊接著執行了 someOperation() 函數,中間有些耗時操作大約消耗 3000ms,當完成這些同步操作后,進入一次事件循環,首先檢查定時器階段是否有到期的任務,定時器的腳本是按照 delay 時間升序存儲在堆內存中,首先取出超時時間最小的定時器函數做檢查,如果 **nowTime - timerTaskRegisterTime > delay** 取出回調函數執行,否則繼續檢查,當檢查到一個沒有到期的定時器函數或達到系統依賴的最大數量限制后,轉移到下一階段。

在我們這個示例中,假設執行完 someOperation() 函數的當前時間為 T + 3000:

  • 檢查 timer1 函數,當前時間為 T + 3000 - T > 1000,已超過預期的延遲時間,取出回調函數執行,繼續檢查。
  • 檢查 timer2 函數,當前時間為 T + 3000 - T < 5000,還沒達到預期的延遲時間,此時退出定時器階段。

pending callbacks

定時器階段完成后,事件循環進入到 pending callbacks 階段,在這個階段執行上一輪事件循環遺留的 I/O 回調。根據 Libuv 文檔的描述:大多數情況下,在輪詢 I/O 后立即調用所有 I/O 回調,但是,某些情況下,調用此類回調會推遲到下一次循環迭代。聽完更像是上一個階段的遺留。

idle, prepare

idle, prepare 階段是給系統內部使用,idle 這個名字很迷惑,盡管叫空閑,但是在每次的事件循環中都會被調用,當它們處于活動狀態時。這一塊的資料介紹也不是很多。略...

poll

poll 是一個重要的階段,這里有一個概念觀察者,有文件 I/O 觀察者,網絡 I/O 觀察者等,它會觀察是否有新的請求進入,包含讀取文件等待響應,等待新的 socket 請求,這個階段在某些情況下是會阻塞的。

阻塞 I/O 超時時間

在阻塞 I/O 之前,要計算它應該阻塞多長時間,參考 Libuv 文檔上的一些描述,以下這些是它計算超時時間的規則:

  • 如果循環使用 UV_RUN_NOWAIT 標志運行、超時為 0。
  • 如果循環將要停止(uv_stop() 被調用),超時為 0。
  • 如果沒有活動的 handlers 或 request,超時為 0。
  • 如果有任何 idle handlers 處于活動狀態,超時為 0。
  • 如果有任何待關閉的 handlers,超時為 0。

如果以上情況都沒有,則采用最近定時器的超時時間,或者如果沒有活動的定時器,則超時時間為無窮大,poll 階段會一直阻塞下去。

示例一

很簡單的一段代碼,我們啟動一個 Server,現在事件循環的其它階段沒有要處理的任務,它會在這里等待下去,直到有新的請求進來。

  1. const http = require('http'); 
  2. const server = http.createServer(); 
  3. server.on('request', req => { 
  4.   console.log(req.url); 
  5. }) 
  6. server.listen(3000); 

示例二

結合階段一的定時器,在看個示例,首先啟動 app.js 做為服務端,模擬延遲 3000ms 響應,這個只是為了配合測試。再運行 client.js 看下事件循環的執行過程:

  • 首先程序調用了一個在 1000ms 后超時的定時器。
  • 之后調用異步函數 someAsyncOperation() 從網絡讀取數據,我們假設這個異步網路讀取需要 3000ms。
  • 當事件循環開始時先進入 timer 階段,發現沒有超時的定時器函數,繼續向下執行。
  • 期間經過 pending callbacks -> idle,prepare 當進入 poll 階段,此時的 http.get() 尚未完成,它的隊列為空,參考上面 poll 阻塞超時時間規則,事件循環機制會檢查最快到達閥值的計時器,而不是一直在這里等待下去。
  • 當大約過了 1000ms 后,進入下一次事件循環進入定時器,執行到期的定時器回調函數,我們會看到日志 setTimeout run after 1003 ms。
  • 在定時器階段結束之后,會再次進入 poll 階段,繼續等待。
  1. // client.js 
  2. const now = Date.now(); 
  3. setTimeout(() => log(`setTimeout run after ${Date.now() - now} ms`), 1000); 
  4. someAsyncOperation(); 
  5. function someAsyncOperation() { 
  6.   http.get('http://localhost:3000/api/news', () => { 
  7.     log(`fetch data success after ${Date.now() - now} ms`); 
  8.   }); 
  9.  
  10. // app.js 
  11. const http = require('http'); 
  12. http.createServer((req, res) => { 
  13.   setTimeout(() => { res.end('OK!') }, 3000); 
  14. }).listen(3000); 

當 poll 階段隊列為空時,并且腳本被 setImmediate() 調度過,此時,事件循環也會結束 poll 階段,進入下一個階段 check。

check

check 階段在 poll 階段之后運行,這個階段包含一個 API setImmediate(cb) 如果有被 setImmediate 觸發的回調函數,就取出執行,直到隊列為空或達到系統的最大限制。

setTimeout VS setImmediate

拿 setTimeout 和 setImmediate 對比,這是一個常見的例子,基于被調用的時機和定時器可能會受到計算機上其它正在運行的應用程序影響,它們的輸出順序,不總是固定的。

  1. setTimeout(() => log('setTimeout')); 
  2. setImmediate(() => log('setImmediate')); 
  3.  
  4. // 第一次運行 
  5. setTimeout 
  6. setImmediate 
  7.  
  8. // 第二次運行 
  9. setImmediate 
  10. setTimeout 

setTimeout VS setImmediate VS fs.readFile

但是一旦把這兩個函數放入一個 I/O 循環內調用,setImmediate 將總是會被優先調用。因為 setImmediate 屬于 check 階段,在事件循環中總是在 poll 階段結束后運行,這個順序是確定的。

  1. fs.readFile(__filename, () => { 
  2.   setTimeout(() => log('setTimeout')); 
  3.   setImmediate(() => log('setImmediate')); 
  4. }) 

close callbacks

在 Libuv 中,如果調用關閉句柄 uv_close(),它將調用關閉回調,也就是事件循環的最后一個階段 close callbacks。

這個階段的工作更像是做一些清理工作,例如,當調用 socket.destroy(),'close' 事件將在這個階段發出,事件循環在執行完這個階段隊列里的回調函數后,檢查循環是否還 alive,如果為 no 退出,否則繼續下一次新的事件循環。

包含 Microtask 的事件循環流程圖

在瀏覽器的事件循環中,把任務劃分為 Task、Microtask,在 Node.js 中是按照階段劃分的,上面我們介紹了 Node.js 事件循環的 6 個階段,給用戶使用的主要是 timer、poll、check、close callback 四個階段,剩下兩個由系統內部調度。這些階段所產生的任務,我們可以看做 Task 任務源,也就是常說的 “Macrotask 宏任務”。

通常我們在談論一個事件循環時還會包含 Microtask,Node.js 里的微任務有 Promise、還有一個也許很少關注的函數 queueMicrotask,它是在 Node.js v11.0.0 之后被實現的,參見 PR/22951。

Node.js 中的事件循環在每一個階段執行后,都會檢查微任務隊列中是否有待執行的任務。

Node.js 11.x 前后差異

Node.js 在 v11.x 前后,每個階段如果即存在可執行的 Task 又存在 Microtask 時,會有一些差異,先看一段代碼:

  1. setImmediate(() => { 
  2.   log('setImmediate1'); 
  3.   Promise.resolve('Promise microtask 1'
  4.     .then(log); 
  5. }); 
  6. setImmediate(() => { 
  7.   log('setImmediate2'); 
  8.   Promise.resolve('Promise microtask 2'
  9.     .then(log); 
  10. }); 

在 Node.js v11.x 之前,當前階段如果存在多個可執行的 Task,先執行完畢,再開始執行微任務?;?v10.22.1 版本運行結果如下:

  1. setImmediate1 
  2. setImmediate2 
  3. Promise microtask 1 
  4. Promise microtask 2 

在 Node.js v11.x 之后,當前階段如果存在多個可執行的 Task,先取出一個 Task 執行,并清空對應的微任務隊列,再次取出下一個可執行的任務,繼續執行?;?v14.15.0 版本運行結果如下:

  1. setImmediate1 
  2. Promise microtask 1 
  3. setImmediate2 
  4. Promise microtask 2 

在 Node.js v11.x 之前的這個執行順序問題,被認為是一個應該要修復的 Bug 在 v11.x 之后并修改了它的執行時機,和瀏覽器保持了一致,詳細參見 issues/22257 討論。

特別的 process.nextTick()

Node.js 中還有一個異步函數 process.nextTick(),從技術上講它不是事件循環的一部分,它在當前操作完成后處理。如果出現遞歸的 process.nextTick() 調用,這將會很糟糕,它會阻斷事件循環。

如下例所示,展示了一個 process.nextTick() 遞歸調用示例,目前事件循環位于 I/O 循環內,當同步代碼執行完成后 process.nextTick() 會被立即執行,它會陷入無限循環中,與同步的遞歸不同的是,它不會觸碰 v8 最大調用堆棧限制。但是會破壞事件循環調度,setTimeout 將永遠得不到執行。

  1. fs.readFile(__filename, () => { 
  2.   process.nextTick(() => { 
  3.     log('nextTick'); 
  4.     run(); 
  5.     function run() { 
  6.       process.nextTick(() => run()); 
  7.     } 
  8.   }); 
  9.   log('sync run'); 
  10.   setTimeout(() => log('setTimeout')); 
  11. }); 
  12.  
  13. // 輸出 
  14. sync run 
  15. nextTick 

將 process.nextTick 改為 setImmediate 雖然是遞歸的,但它不會影響事件循環調度,setTimeout 在下一次事件循環中被執行。

  1. fs.readFile(__filename, () => { 
  2.   process.nextTick(() => { 
  3.     log('nextTick'); 
  4.     run(); 
  5.     function run() { 
  6.       setImmediate(() => run()); 
  7.     } 
  8.   }); 
  9.   log('sync run'); 
  10.   setTimeout(() => log('setTimeout')); 
  11. }); 
  12.  
  13. // 輸出 
  14. sync run 
  15. nextTick 
  16. setTimeout 

process.nextTick 是立即執行,setImmediate 是在下一次事件循環的 check 階段執行。但是,它們的名字著實讓人費解,也許會想這兩個名字交換下比較好,但它屬于遺留問題,也不太可能會改變,因為這會破壞 NPM 上大部分的軟件包。

在 Node.js 的文檔中也建議開發者盡可能的使用 setImmediate(),也更容易理解。

總結

Node.js 事件循環分為 6 個階段,每個階段都有一個 FIFO(先進先出)隊列執行回調函數,這幾個階段之間執行的優先級順序還是明確的。

事件循環的每一個階段,有時還會伴隨著一些微任務而運行,這里以 Node.js v11.x 版本為分界線會有一些差異,文中也都有詳細的介紹。

在上一篇介紹了瀏覽器的事件循環機制,本篇又詳細的介紹了 Node.js 中的事件循環機制,留給大家一個思考問題,結合自己的理解,總結下瀏覽器與 Node.js 中事件循環的一些差異,這個也是常見的一個面試題,歡迎在留言區討論。

在 Cnode 上看到的兩篇事件循環相關文章,推薦給大家,文章很精彩,評論也更加精彩。

  • https://cnodejs.org/topic/5a9108d78d6e16e56bb80882
  • https://cnodejs.org/topic/57d68794cb6f605d360105bf

Reference

http://docs.libuv.org/en/v1.x/design.html

 

https://nodejs.org/zh-cn/docs/guides/event-loop-timers-and-nexttick

 

責任編輯:武曉燕 來源: 編程界
相關推薦

2024-01-05 08:49:15

Node.js異步編程

2021-05-27 09:00:00

Node.js開發線程

2023-01-31 16:43:31

?Node.js事件循環

2021-10-15 09:56:10

JavaScript異步編程

2021-11-06 18:40:27

js底層模塊

2021-09-26 05:06:04

Node.js模塊機制

2021-12-18 07:42:15

Ebpf 監控 Node.js

2011-09-08 13:46:14

node.js

2012-02-03 09:25:39

Node.js

2011-11-10 08:55:00

Node.js

2021-03-04 23:12:57

Node.js異步迭代器開發

2015-03-10 10:59:18

Node.js開發指南基礎介紹

2022-03-26 16:51:27

Node.jstrace架構

2021-04-06 10:15:29

Node.jsHooks前端

2011-09-08 14:16:12

Node.js

2021-06-02 09:01:19

JavaScript 前端異步編程

2021-03-16 16:16:41

GeneratorWebsockets前端

2021-06-10 07:51:07

Node.js循環機制

2021-02-01 15:42:45

Node.jsSQL應用程序

2025-01-13 00:00:00

點贊
收藏

51CTO技術棧公眾號

99视频这里有精品| 天天摸天天干天天操| 国产精品欧美日韩一区| 在线视频欧美区| 日韩精品成人一区二区在线观看| 中文字幕天堂在线| 99热国内精品| 亚洲国产欧美自拍| 丰满少妇在线观看| 91极品在线| av在线不卡电影| 国产精品露脸av在线| 欧美日韩中文字幕在线观看| 全国精品免费看| 欧美日韩一区二区三区免费看| 992tv快乐视频| 欧美亚洲日本| 国产大片一区二区| 国产精品激情av电影在线观看| 国产高潮流白浆| 中文字幕精品影院| 日韩美女天天操| 亚洲 欧美 另类人妖| 丁香高清在线观看完整电影视频| 国产欧美一区二区精品性| 99久久一区三区四区免费| 三级网站在线播放| 在线看片日韩| 久久精品2019中文字幕| 亚洲色图14p| 国产suv精品一区二区33| 婷婷亚洲五月| 中文字幕v亚洲ⅴv天堂| 精品视频站长推荐| 国内不卡的一区二区三区中文字幕 | 黄色美女网站在线观看| 成人精品视频一区二区三区尤物| 国产精品日韩欧美大师| 久久久久久久久久久影院| 欧美在线二区| 久久精品国产精品亚洲| 亚洲av无码一区二区三区人| 另类尿喷潮videofree| 欧美一级二级三级蜜桃| 999在线免费视频| 国产在线看片免费视频在线观看| 亚洲精品国产一区二区精华液 | 亚洲精品在线二区| 欧美乱妇高清无乱码| 日韩av在线中文| 韩日精品一区二区| 欧美日韩综合视频网址| 婷婷无套内射影院| 精灵使的剑舞无删减版在线观看| 成人欧美一区二区三区黑人麻豆 | 精品视频一区二区三区四区| 成人免费视频国产| 国产精品一区二区在线看| 91精品久久久久久久久青青 | 日韩免费一区二区三区在线播放| 污污的视频免费| 99久久999| 日韩欧美精品三级| 男人添女人荫蒂国产| 91精品导航| 精品久久99ma| 天堂www中文在线资源| 老司机aⅴ在线精品导航| 日韩精品在线观看网站| 在线免费观看麻豆| 欧美电影一区| 欧美国产日韩精品| 欧美不卡视频在线观看| 久久视频一区| 国产精品美女久久| 国产精品毛片一区二区在线看舒淇 | 五月激情婷婷在线| 精品视频一区二区三区在线观看| 日韩欧美中文字幕精品| 日本不卡视频一区| 欧美人与物videos另类xxxxx| 亚洲深夜福利视频| 波兰性xxxxx极品hd| 国产综合色产| 欧美一区二区三区四区在线 | 欧美一级艳片视频免费观看| 午夜影院福利社| 久久99视频| 久久久精品久久久| 四虎成人精品永久免费av| 狂野欧美一区| 国产精品久久久久7777婷婷| 亚洲手机在线观看| 不卡的av网站| 亚洲第一导航| 高潮在线视频| 欧美裸体bbwbbwbbw| 国产婷婷在线观看| 成人羞羞视频播放网站| 欧美精品久久久久久久久久| 国产suv精品一区二区33| 国产一区二区三区四区五区美女 | 成人免费在线电影| 亚洲一区二区在线免费看| 99爱视频在线| 精品一级视频| 国产亚洲激情在线| 精品无码久久久久久久| 美女网站色91| 久久国产精品久久精品国产| caoporn免费在线| 色88888久久久久久影院野外| 熟妇女人妻丰满少妇中文字幕| 中国av一区| 久久久亚洲网站| 一区二区三区黄色片| 91啦中文在线观看| 国产欧美久久久久| 亚洲伦理一区二区| 亚洲天堂av女优| 天堂网一区二区三区| 国产麻豆日韩欧美久久| 日韩av电影免费在线观看| aa级大片免费在线观看| 欧美一区二区在线看| 国产又粗又硬视频| 亚洲专区免费| 精品国产乱码一区二区三区四区| 免费黄色在线视频网站| 亚洲综合自拍偷拍| 成人在线观看www| 丝袜美腿一区| 亚洲精品综合久久中文字幕| 99免费在线观看| 懂色av中文字幕一区二区三区| 曰韩不卡视频| 国产成人a视频高清在线观看| 亚洲免费电影一区| 在线观看免费av片| 99精品视频一区二区三区| 嫩草影院中文字幕| 午夜精品在线| 欧美激情图片区| 性生交大片免费看女人按摩| 亚洲女性喷水在线观看一区| 亚洲精品20p| 国产精品久久久久蜜臀| 国产日韩在线免费| 麻豆传媒在线观看| 91超碰这里只有精品国产| 中文字幕91视频| 久久99久久精品| 国产系列第一页| 国产精品成人3p一区二区三区| 日韩中文字幕第一页| 怡红院男人天堂| 国产精品国产三级国产普通话蜜臀| 91淫黄看大片| 国产成人高清| 国产精品视频久久久| av电影在线网| 这里只有精品视频在线观看| 黄色一级片中国| 国产盗摄视频一区二区三区| 成人性生活视频免费看| 日韩美女毛片| 国产精品露脸自拍| 国产精品刘玥久久一区| 日韩欧美不卡一区| 日韩精品一区二区av| 久久久久久久综合色一本| 国产福利影院在线观看| 婷婷激情综合| 国产精品视频在线免费观看| 黑人巨大亚洲一区二区久| 国产一区二区三区在线看 | 强制高潮抽搐sm调教高h| 激情图片小说一区| av片在线免费| 综合色就爱涩涩涩综合婷婷| 国产精品中文字幕在线| 欧美大胆的人体xxxx| 日韩电影在线观看永久视频免费网站| 日本高清不卡码| 国产精品久久久久一区二区三区共| 一级片黄色免费| 国产亚洲网站| 影音先锋在线亚洲| 日本精品影院| 91沈先生作品| 欧美片第一页| 欧美xxxx做受欧美.88| 香蕉视频911| 欧美日韩和欧美的一区二区| 国产稀缺真实呦乱在线| 日本一区二区三区久久久久久久久不 | 国产一卡二卡三卡| 亚洲精品免费在线观看| 欧美激情aaa| 国产91精品精华液一区二区三区| 久草综合在线观看| 精品动漫3d一区二区三区免费| 少妇免费毛片久久久久久久久| 视频精品一区| 国产欧美欧洲在线观看| 免费看男女www网站入口在线 | 亚洲天堂一区二区| 欧美日韩xxx| av在线电影院| 精品视频在线导航| wwwav在线播放| 欧美日本免费一区二区三区| 800av免费在线观看| 亚洲欧洲精品一区二区三区| 亚洲第一页av| 成人午夜看片网址| 在线观看免费av网址| 免费日韩精品中文字幕视频在线| 久久久久久久久久伊人| 青青草91久久久久久久久| 久久精品国产一区二区三区日韩| 香蕉成人app| 91久久在线视频| 国产精品天堂蜜av在线播放| 日韩免费在线播放| 51av在线| 午夜伦理精品一区| 深夜国产在线播放| 久久成人精品电影| 免费观看久久久久| 色噜噜久久综合伊人一本| 噜噜噜在线观看播放视频| 亚洲国产精品久久| 男人的天堂a在线| 欧美不卡一区二区| 亚洲第一大网站| 欧美一二三区在线观看| 国产男男gay体育生白袜| 欧美日韩高清一区二区不卡| 最近中文字幕在线观看| 91久久久免费一区二区| 波多野结衣视频在线看| 91成人在线免费观看| 国产情侣自拍av| 精品国产成人在线| www.日本精品| 黑人与娇小精品av专区| 国产www在线| 色综合天天做天天爱| 无码人妻一区二区三区免费| 欧美中文字幕一二三区视频| 久久久精品毛片| 欧美日韩中文一区| 国产精品久久久久久久一区二区 | 亚洲精品国产精品国| 日韩一级二级三级| 好男人www在线视频| 亚洲电影免费观看高清完整版在线| 欧美一级做性受免费大片免费| 亚洲国产天堂久久国产91| 青青青草网站免费视频在线观看| 亚洲图片欧美日产| 日本电影全部在线观看网站视频| 精品国产区一区二区三区在线观看| 成人福利片网站| 欧美激情综合色| 亚洲精品中文字幕| 国产精品久久久亚洲| 国产精品视频一区视频二区| 国产chinese精品一区二区| 久久99国产精品久久99大师| 欧美深深色噜噜狠狠yyy| 久久在线视频免费观看| 成年人视频大全| 亚洲高清二区| 热久久精品国产| 国产一区二区三区在线观看免费视频 | 国产专区在线视频| 一区二区福利| 蜜臀一区二区三区精品免费视频| 从欧美一区二区三区| a级大片在线观看| 亚洲天堂福利av| 1级黄色大片儿| 欧美日韩电影在线| 亚洲国产视频一区二区三区| 亚洲另类xxxx| 亚洲国产精品精华素| 欧美有码在线观看视频| 成人短视频软件网站大全app| 国产99午夜精品一区二区三区 | 中文字幕在线播| 欧美一区永久视频免费观看| 香蕉视频免费在线看| 色黄久久久久久| 欧美极品videos大乳护士| 成人国产精品日本在线| 日韩高清在线免费观看| 一区高清视频| 男人天堂欧美日韩| 香蕉在线观看视频| 久久久久久夜精品精品免费| 精品国产视频一区二区三区| 岛国av一区二区在线在线观看| 国产成人精品一区二区色戒| 亚洲国产毛片完整版| 北岛玲一区二区三区| 午夜精品福利电影| 国产一区二区三区亚洲综合| 日本不卡一区| 日韩香蕉视频| 成人在线短视频| 国产精品久久久久久久午夜片| 日韩精品视频免费看| 日韩精品一区二区三区四区 | 日本激情视频网站| 久久久999成人| av成人亚洲| 欧美精品一区二区三区在线看午夜| 欧美另类视频| 天堂av2020| 日本女人一区二区三区| 欧美夫妇交换xxx| 亚洲欧美二区三区| 伊人久久一区二区| 中文一区二区视频| 男人皇宫亚洲男人2020| 国产综合 伊人色| 激情欧美日韩| 少妇伦子伦精品无吗| 亚洲精选视频在线| 中国一级片黄色一级片黄| 国产偷亚洲偷欧美偷精品| www成人免费观看| 国产精品二区三区四区| 欧美精品二区| 国产精品91av| 一区二区三区免费看视频| 国产片在线播放| 另类视频在线观看| 国产成年精品| 日韩在线视频在线| 国产在线视视频有精品| 欧美做爰啪啪xxxⅹ性| 欧美疯狂性受xxxxx喷水图片| 午夜在线小视频| 成人性生交大片免费看视频直播| 久久在线视频| 日韩欧美中文在线视频| 亚洲黄色av一区| 丰满肉嫩西川结衣av| 午夜精品一区二区三区av| 狼人精品一区二区三区在线| 久久国产成人精品国产成人亚洲| 99re成人在线| 日韩在线视频不卡| 这里只有精品在线播放| 四虎精品永久免费| 色爽爽爽爽爽爽爽爽| 丁香激情综合五月| 欧美精品亚洲精品日韩精品| 亚洲欧美一区二区精品久久久| 精品国产免费人成网站| 亚洲精品国产精品国自产观看| 激情欧美一区二区| 欧美成人片在线观看| 亚洲国产欧美自拍| 中文字幕系列一区| 中文字幕超清在线免费观看| 国产成人高清在线| a v视频在线观看| 在线观看亚洲区| 国产精品国产三级在线观看| 2018国产在线| 国产精品免费视频观看| 国产日韩免费视频| 97视频免费看| 日韩黄色大片网站| aaa黄色大片| 色婷婷国产精品久久包臀| 日本最新在线视频| 高清不卡一区二区三区| 久久午夜激情| 极品魔鬼身材女神啪啪精品| 亚洲激情在线观看视频免费| 欧美日韩精品免费观看视欧美高清免费大片 | 欧美尤物巨大精品爽| 欧美电影《睫毛膏》| 亚洲调教欧美在线| 欧美日韩国产在线观看| 3344国产永久在线观看视频| 亚洲欧洲精品在线| proumb性欧美在线观看| 伊人影院中文字幕| 68精品久久久久久欧美| 天天影视天天精品| 日本高清www| 日韩欧美卡一卡二| 欧美一区=区三区| 欧美日本视频在线观看|