精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲国产欧美另类| 噜噜噜在线视频| 18加网站在线| 国产不卡视频在线播放| 欧美精品www| 亚洲一区二区三区综合| 777午夜精品电影免费看| 国产午夜精品美女毛片视频| 国产日韩欧美中文| 国产精彩视频在线| 欧美呦呦网站| 亚洲第一综合天堂另类专| 日韩有码免费视频| 中文字幕在线三区| 国产欧美日韩视频一区二区| 亚洲一区二区三区xxx视频| 久久露脸国语精品国产91| 日本在线电影一区二区三区| 精品国精品国产| 999精品视频在线| 波多野结衣中文在线| 亚洲国产高清aⅴ视频| 国内精品二区| 97精品人妻一区二区三区在线| 99成人在线| 久久综合国产精品台湾中文娱乐网| 亚洲一区二区三区四区五区六区| 国产aa精品| 91成人网在线| 国产精品一区二区免费在线观看| 黄色网在线看| 国产欧美精品一区二区三区四区| 精品1区2区| 亚洲奶汁xxxx哺乳期| 精品一区二区综合| 国产精品精品视频| 久久久久久在线观看| 伊人影院久久| 欧美成人精品xxx| 午夜国产福利视频| 国产一区二区三区四区二区| 亚洲第一区中文字幕| 宇都宫紫苑在线播放| 久久精品97| 欧美亚洲综合色| 男女视频一区二区三区| 黄页网站大全在线免费观看| 亚洲男帅同性gay1069| 亚洲在线播放电影| 在线观看免费高清完整| 国产欧美视频在线观看| 色视频一区二区三区| 国产日产精品久久久久久婷婷| 99re成人精品视频| 久久综合九色综合网站| 性猛交xxxx| 久久综合九色综合久久久精品综合| 国内精品久久国产| 三级视频在线| 久久久.com| 日本不卡二区高清三区| 触手亚洲一区二区三区| 国产日韩欧美综合在线| 日韩免费毛片| 秋霞成人影院| 亚洲精品第1页| 日韩精品在线视频免费观看| 男女羞羞视频在线观看| 亚洲第一福利一区| 欧美极品欧美精品欧美| 亚洲欧美电影| 色综合久久综合中文综合网| 欧美亚洲日本在线观看| 成人在线中文| 日韩一级二级三级精品视频| 性生交大片免费看l| 久久悠悠精品综合网| 亚洲欧洲一区二区三区久久| 69精品无码成人久久久久久| 日韩三级在线| 欧美高清视频在线播放| 日本一级片免费看| 日本美女一区二区三区视频| 成人免费自拍视频| 日韩一级片免费| 国产亚洲一区二区在线观看| 成人免费观看毛片| 精品一区二区三区自拍图片区| 性色av免费观看| 日本不卡一区二区| 91免费视频网站| 欧美视频一二区| 久久久不卡影院| 中文字幕一区二区三区精彩视频| 午夜av在线免费观看| 黑人精品xxx一区一二区| 91插插插插插插插插| 精品国产欧美| 亚洲片在线观看| 午夜激情福利网| 国产视频欧美| 成人欧美一区二区三区黑人| 亚洲色图欧美视频| 亚洲欧洲日韩在线| 69堂免费视频| 精品入口麻豆88视频| 日韩成人性视频| 欧美性生交大片| 亚洲精选在线| 91精品视频免费| 日韩精品一二| 一区二区在线观看av| 男女av免费观看| 日本一区二区三区播放| 亚洲品质视频自拍网| 欧美精品一级片| 日韩国产欧美在线播放| 国产精品毛片va一区二区三区| jizz日韩| 欧美日韩国产影院| 日本女人性视频| 欧美日韩色图| 91tv亚洲精品香蕉国产一区7ujn| 天天爽人人爽夜夜爽| 精品视频在线观看免费观看| 亚洲片在线观看| 国产精品500部| 国产精品亚洲一区二区三区妖精| 日本一区二区在线视频| 欧美极品videos大乳护士| 欧美大片在线观看一区二区| 日韩一区二区三区四区视频| 免费一区视频| 久久精品日韩| www欧美xxxx| 日韩一级免费观看| 国产成人在线综合| www国产精品内射老熟女| 激情视频一区二区| 亚洲怡红院在线| 成人在线免费观看| 日本麻豆一区二区三区视频| 久久综合给合久久狠狠色| 俺来也官网欧美久久精品| 欧美一区二区三区影视| 中文字幕无码日韩专区免费| 老司机午夜精品99久久| 视频一区二区精品| 国产精品高清乱码在线观看| 精品亚洲永久免费精品| 国产www在线| 26uuu色噜噜精品一区二区| www.av中文字幕| 欧美人体视频| 欧美中文字幕在线播放| 日本人妖在线| 色婷婷狠狠综合| 久久久久久九九九九九| 视频一区二区中文字幕| 天天人人精品| 成年人在线免费看片| www久久久com| 久久久综合视频| 已婚少妇美妙人妻系列| 国产探花在线精品一区二区| 国产suv精品一区二区| 九色在线观看视频| 欧美性色黄大片手机版| 亚洲AV成人无码网站天堂久久| 久久狠狠亚洲综合| 国产欧美自拍视频| 91精品啪在线观看国产爱臀 | 精品久久综合| 国产精品一区二区三区成人| 国产区在线观看| 欧美成人激情免费网| 成人精品在线看| 国产欧美日韩视频在线观看| 色噜噜狠狠一区二区三区狼国成人| 自拍日韩欧美| 精品一区二区三区国产| 国产一区一一区高清不卡| 久久精品视频免费播放| 东京干手机福利视频| 欧美特级www| 日本二区三区视频| 成人国产精品免费观看动漫| 男女午夜激情视频| 五月激情综合| 久久99精品久久久久久水蜜桃| 国模一区二区| 欧美成人免费视频| 欧洲亚洲精品视频| 欧美妇女性影城| 狠狠躁夜夜躁人人爽天天高潮| 国产日韩精品一区二区三区| 999久久久精品视频| 99riav国产精品| 一区二区三区日韩视频| 欧洲亚洲视频| 91社区国产高清| 极品美女一区| 九九综合九九综合| www黄在线观看| 亚洲第一区在线观看| 91亚洲国产成人久久精品麻豆| 午夜电影网一区| 免费在线观看黄色小视频| 91丨porny丨首页| 91蝌蚪视频在线| 丝袜诱惑制服诱惑色一区在线观看| 特级西西444| 青青草国产免费一区二区下载 | 青青草成人在线| 18在线观看的| 自拍偷拍免费精品| 亚洲欧美色视频| 日韩欧美一区二区在线视频| 免费在线不卡av| 午夜精品福利久久久| 永久免费看mv网站入口| 久久精品欧美日韩精品| yy1111111| 国产91色综合久久免费分享| 国产精品视频中文字幕| 免费看黄裸体一级大秀欧美| 国产亚洲黄色片| 99久久99久久精品国产片桃花 | 色成年激情久久综合| 欧美国产日韩综合| 中文字幕在线一区二区三区| 欧美偷拍一区二区三区| 91免费在线看| a级片在线观看视频| 国产精品99久久久| 欧美激情第一区| 韩国女主播成人在线| 国产一级做a爰片久久| 久久久国产亚洲精品| 国产亚洲综合视频| 国产模特精品视频久久久久| 欧美性极品xxxx做受| 亚洲欧美日韩另类精品一区二区三区 | 国产精品久久精品视| 婷婷五月在线视频| 亚洲va久久| 8x海外华人永久免费日韩内陆视频 | 亚欧视频在线观看| 亚洲一区二区不卡免费| 久久久久久久久久久久国产| 夜夜夜精品看看| 久久精品人妻一区二区三区| 亚洲综合色噜噜狠狠| 亚洲人成影视在线观看| 日本一二三区在线| 成人av地址| 99re6在线| 在线精品自拍| 国产伦理一区二区三区| 老司机在线精品视频| 九色综合婷婷综合| 欧美男gay| 污视频在线免费观看一区二区三区| 精品久久国产| 亚洲成人免费网站| youjizz在线视频| 日本韩国欧美一区| 中文字幕永久免费视频| 欧美三级资源在线| 亚洲天堂aaa| 日韩欧美视频在线| 视频二区在线观看| 亚洲丝袜av一区| 麻豆传媒在线免费看| 欧美激情久久久| xxxxx性欧美特大| 国产精品入口免费视频一| 不卡一区视频| 国产日韩欧美亚洲一区| 免费电影一区二区三区| 99re视频在线播放| 黄色国产在线观看| 日本高清视频免费观看| 欧美日韩直播| 亚洲欧洲日韩在线| 日本不卡免费高清视频| 被黑人猛躁10次高潮视频| av福利在线播放| 亚洲二区精品| 日韩欧美你懂的| 热re99久久精品国99热蜜月| youjizz亚洲女人| 日韩高清一区| 国产精华一区二区三区| 日韩大尺度在线观看| 午夜精品一区二区在线观看| 欧美在线二区| 国产女女做受ⅹxx高潮| 激情图片小说一区| 亚洲成人av免费在线观看| 国产精品美女一区二区在线观看| 久草视频免费在线播放| 在线观看亚洲一区| 亚洲国产精品成人久久蜜臀| 亚洲一区二区久久久| av网站大全在线| 99国产精品99久久久久久| 日韩激情视频在线播放| av无码av天天av天天爽| 国产精品久久久久一区| 青青操免费在线视频| 欧美日韩免费视频| 亚洲色图另类小说| 欧美激情视频在线观看| h1515四虎成人| 久久精品国产综合精品| 欧美福利影院| 国产乱码精品一区二区三区日韩精品 | 免费av网站在线播放| 尤物九九久久国产精品的特点| 超碰97免费在线| 亚洲综合日韩在线| 日韩情爱电影在线观看| 亚洲精品中文字幕无码蜜桃| 成人av在线播放网址| 久久一级免费视频| 午夜激情久久| 麻豆一区二区三区在线观看| 免费不卡在线观看| 久久精品视频18| 欧美日韩国产中文精品字幕自在自线 | 1pondo在线播放免费| 久久久久久一级片| 国产精品99久久久久久大便| 香蕉久久夜色精品国产| 少妇熟女视频一区二区三区| 国产探花视频在线观看| 欧美性猛交xxxx免费看| 国产又粗又猛视频| 这里只有精品久久| 亚洲第一二三四区| 欧美激情第六页| 亚洲免费网站| 国产亚洲无码精品| 精品免费在线视频| 亚洲aⅴ乱码精品成人区| 91国语精品自产拍在线观看性色 | 亚洲精品在线视频| 理论不卡电影大全神| 激情小说综合区| 久久精品动漫| 老头老太做爰xxx视频| 日本高清不卡视频| 91caoporm在线视频| 国产精品久久久久久久久粉嫩av | 欧美精品在欧美一区二区| 国产精品一区二区x88av| 性生交大片免费全黄| 日韩欧美区一区二| 成av人片在线观看www| 久久综合九九| 捆绑调教美女网站视频一区| 91久久久久久久久久久久久久| 欧美一卡2卡3卡4卡| 最爽无遮挡行房视频在线| 国产精品三级av| 精品日韩电影| 欧美高清在线| 久久久九九九热| 亚洲一区成人在线| 六月丁香综合网| 欧洲亚洲妇女av| 日韩一区电影| 日本wwwwwww| 色婷婷久久久综合中文字幕| 婷婷五月在线视频| 风间由美久久久| 久久久久久亚洲精品杨幂换脸| 手机看片国产日韩| 日韩欧美一区二区免费| 97成人资源| 椎名由奈jux491在线播放| 成人精品视频网站| 国产精华7777777| 欧美日韩高清在线观看| 亚洲专区视频| 美女被艹视频网站| 精品女厕一区二区三区| 日本激情在线观看| 精品国产_亚洲人成在线| 老司机精品视频在线| 久久视频免费在线观看| 中文字幕亚洲字幕| 米奇精品关键词| 制服丝袜中文字幕第一页| 岛国视频午夜一区免费在线观看| 午夜不卡视频| 欧美精品一区二区三区在线四季| 国产美女在线观看一区| 人人草在线观看|