日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

nodejs中使用worker_threads来创建新的线程

發(fā)布時(shí)間:2024/2/28 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nodejs中使用worker_threads来创建新的线程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

  • 簡(jiǎn)介
  • worker_threads
    • isMainThread
    • MessageChannel
    • parentPort和MessagePort
    • markAsUntransferable
    • SHARE_ENV
    • workerData
    • worker類
    • receiveMessageOnPort
    • moveMessagePortToContext
  • worker_threads的線程池

簡(jiǎn)介

之前的文章中提到了,nodejs中有兩種線程,一種是event loop用來(lái)相應(yīng)用戶的請(qǐng)求和處理各種callback。另一種就是worker pool用來(lái)處理各種耗時(shí)操作。

nodejs的官網(wǎng)提到了一個(gè)能夠使用nodejs本地woker pool的lib叫做webworker-threads。

可惜的是webworker-threads的最后一次更新還是在2年前,而在最新的nodejs 12中,根本無(wú)法使用。

而webworker-threads的作者則推薦了一個(gè)新的lib叫做web-worker。

web-worker是構(gòu)建于nodejs的worker_threads之上的,本文將會(huì)詳細(xì)講解worker_threads和web-worker的使用。

worker_threads

worker_threads模塊的源代碼源自lib/worker_threads.js,它指的是工作線程,可以開啟一個(gè)新的線程來(lái)并行執(zhí)行javascript程序。

worker_threads主要用來(lái)處理CPU密集型操作,而不是IO操作,因?yàn)閚odejs本身的異步IO已經(jīng)非常強(qiáng)大了。

worker_threads中主要有5個(gè)屬性,3個(gè)class和3個(gè)主要的方法。接下來(lái)我們將會(huì)一一講解。

isMainThread

isMainThread用來(lái)判斷代碼是否在主線程中運(yùn)行,我們看一個(gè)使用的例子:

const { Worker, isMainThread } = require('worker_threads');if (isMainThread) {console.log('在主線程中');new Worker(__filename); } else {console.log('在工作線程中');console.log(isMainThread); // 打印 'false'。 }

上面的例子中,我們從worker_threads模塊中引入了Worker和isMainThread,Worker就是工作線程的主類,我們將會(huì)在后面詳細(xì)講解,這里我們使用Worker創(chuàng)建了一個(gè)工作線程。

MessageChannel

MessageChannel代表的是一個(gè)異步雙向通信channel。MessageChannel中沒有方法,主要通過(guò)MessageChannel來(lái)連接兩端的MessagePort。

class MessageChannel {readonly port1: MessagePort;readonly port2: MessagePort;}

當(dāng)我們使用new MessageChannel()的時(shí)候,會(huì)自動(dòng)創(chuàng)建兩個(gè)MessagePort。

const { MessageChannel } = require('worker_threads');const { port1, port2 } = new MessageChannel(); port1.on('message', (message) => console.log('received', message)); port2.postMessage({ foo: 'bar' }); // Prints: received { foo: 'bar' } from the `port1.on('message')` listener

通過(guò)MessageChannel,我們可以進(jìn)行MessagePort間的通信。

parentPort和MessagePort

parentPort是一個(gè)MessagePort類型,parentPort主要用于worker線程和主線程進(jìn)行消息交互。

通過(guò)parentPort.postMessage()發(fā)送的消息在主線程中將可以通過(guò)worker.on(‘message’)接收。

主線程中通過(guò)worker.postMessage()發(fā)送的消息將可以在工作線程中通過(guò)parentPort.on(‘message’)接收。

我們看一下MessagePort的定義:

class MessagePort extends EventEmitter {close(): void;postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;ref(): void;unref(): void;start(): void;addListener(event: "close", listener: () => void): this;addListener(event: "message", listener: (value: any) => void): this;addListener(event: string | symbol, listener: (...args: any[]) => void): this;emit(event: "close"): boolean;emit(event: "message", value: any): boolean;emit(event: string | symbol, ...args: any[]): boolean;on(event: "close", listener: () => void): this;on(event: "message", listener: (value: any) => void): this;on(event: string | symbol, listener: (...args: any[]) => void): this;once(event: "close", listener: () => void): this;once(event: "message", listener: (value: any) => void): this;once(event: string | symbol, listener: (...args: any[]) => void): this;prependListener(event: "close", listener: () => void): this;prependListener(event: "message", listener: (value: any) => void): this;prependListener(event: string | symbol, listener: (...args: any[]) => void): this;prependOnceListener(event: "close", listener: () => void): this;prependOnceListener(event: "message", listener: (value: any) => void): this;prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;removeListener(event: "close", listener: () => void): this;removeListener(event: "message", listener: (value: any) => void): this;removeListener(event: string | symbol, listener: (...args: any[]) => void): this;off(event: "close", listener: () => void): this;off(event: "message", listener: (value: any) => void): this;off(event: string | symbol, listener: (...args: any[]) => void): this;}

MessagePort繼承自EventEmitter,它表示的是異步雙向通信channel的一端。這個(gè)channel就叫做MessageChannel,MessagePort通過(guò)MessageChannel來(lái)進(jìn)行通信。

我們可以通過(guò)MessagePort來(lái)傳輸結(jié)構(gòu)體數(shù)據(jù),內(nèi)存區(qū)域或者其他的MessagePorts。

從源代碼中,我們可以看到MessagePort中有兩個(gè)事件,close和message。

close事件將會(huì)在channel的中任何一端斷開連接的時(shí)候觸發(fā),而message事件將會(huì)在port.postMessage時(shí)候觸發(fā),下面我們看一個(gè)例子:

const { MessageChannel } = require('worker_threads'); const { port1, port2 } = new MessageChannel();// Prints: // foobar // closed! port2.on('message', (message) => console.log(message)); port2.on('close', () => console.log('closed!'));port1.postMessage('foobar'); port1.close();

port.on(‘message’)實(shí)際上為message事件添加了一個(gè)listener,port還提供了addListener方法來(lái)手動(dòng)添加listener。

port.on(‘message’)會(huì)自動(dòng)觸發(fā)port.start()方法,表示啟動(dòng)一個(gè)port。

當(dāng)port有l(wèi)istener存在的時(shí)候,這表示port存在一個(gè)ref,當(dāng)存在ref的時(shí)候,程序是不會(huì)結(jié)束的。我們可以通過(guò)調(diào)用port.unref方法來(lái)取消這個(gè)ref。

接下來(lái)我們看一下怎么通過(guò)port來(lái)傳輸消息:

port.postMessage(value[, transferList])

postMessage可以接受兩個(gè)參數(shù),第一個(gè)參數(shù)是value,這是一個(gè)JavaScript對(duì)象。第二個(gè)參數(shù)是transferList。

先看一個(gè)傳遞一個(gè)參數(shù)的情況:

const { MessageChannel } = require('worker_threads'); const { port1, port2 } = new MessageChannel();port1.on('message', (message) => console.log(message));const circularData = {}; circularData.foo = circularData; // Prints: { foo: [Circular] } port2.postMessage(circularData);

通常來(lái)說(shuō)postMessage發(fā)送的對(duì)象都是value的拷貝,但是如果你指定了transferList,那么在transferList中的對(duì)象將會(huì)被transfer到channel的接受端,并且不再存在于發(fā)送端,就好像把對(duì)象傳送出去一樣。

transferList是一個(gè)list,list中的對(duì)象可以是ArrayBuffer, MessagePort 和 FileHandle。

如果value中包含SharedArrayBuffer對(duì)象,那么該對(duì)象不能被包含在transferList中。

看一個(gè)包含兩個(gè)參數(shù)的例子:

const { MessageChannel } = require('worker_threads'); const { port1, port2 } = new MessageChannel();port1.on('message', (message) => console.log(message));const uint8Array = new Uint8Array([ 1, 2, 3, 4 ]); // post uint8Array的拷貝: port2.postMessage(uint8Array);port2.postMessage(uint8Array, [ uint8Array.buffer ]);//port2.postMessage(uint8Array);

上面的例子將輸出:

Uint8Array(4) [ 1, 2, 3, 4 ] Uint8Array(4) [ 1, 2, 3, 4 ]

第一個(gè)postMessage是拷貝,第二個(gè)postMessage是transfer Uint8Array底層的buffer。

如果我們?cè)俅握{(diào)用port2.postMessage(uint8Array),我們會(huì)得到下面的錯(cuò)誤:

DOMException [DataCloneError]: An ArrayBuffer is detached and could not be cloned.

buffer是TypedArray的底層存儲(chǔ)結(jié)構(gòu),如果buffer被transfer,那么之前的TypedArray將會(huì)變得不可用。

markAsUntransferable

要想避免這個(gè)問題,我們可以調(diào)用markAsUntransferable將buffer標(biāo)記為不可transferable. 我們看一個(gè)markAsUntransferable的例子:

const { MessageChannel, markAsUntransferable } = require('worker_threads');const pooledBuffer = new ArrayBuffer(8); const typedArray1 = new Uint8Array(pooledBuffer); const typedArray2 = new Float64Array(pooledBuffer);markAsUntransferable(pooledBuffer);const { port1 } = new MessageChannel(); port1.postMessage(typedArray1, [ typedArray1.buffer ]);console.log(typedArray1); console.log(typedArray2);

SHARE_ENV

SHARE_ENV是傳遞給worker構(gòu)造函數(shù)的一個(gè)env變量,通過(guò)設(shè)置這個(gè)變量,我們可以在主線程與工作線程進(jìn)行共享環(huán)境變量的讀寫。

const { Worker, SHARE_ENV } = require('worker_threads'); new Worker('process.env.SET_IN_WORKER = "foo"', { eval: true, env: SHARE_ENV }).on('exit', () => {console.log(process.env.SET_IN_WORKER); // Prints 'foo'.});

workerData

除了postMessage(),還可以通過(guò)在主線程中傳遞workerData給worker的構(gòu)造函數(shù),從而將主線程中的數(shù)據(jù)傳遞給worker:

const { Worker, isMainThread, workerData } = require('worker_threads');if (isMainThread) {const worker = new Worker(__filename, { workerData: 'Hello, world!' }); } else {console.log(workerData); // Prints 'Hello, world!'. }

worker類

先看一下worker的定義:

class Worker extends EventEmitter {readonly stdin: Writable | null;readonly stdout: Readable;readonly stderr: Readable;readonly threadId: number;readonly resourceLimits?: ResourceLimits;constructor(filename: string | URL, options?: WorkerOptions);postMessage(value: any, transferList?: Array<ArrayBuffer | MessagePort>): void;ref(): void;unref(): void;terminate(): Promise<number>;getHeapSnapshot(): Promise<Readable>;addListener(event: "error", listener: (err: Error) => void): this;addListener(event: "exit", listener: (exitCode: number) => void): this;addListener(event: "message", listener: (value: any) => void): this;addListener(event: "online", listener: () => void): this;addListener(event: string | symbol, listener: (...args: any[]) => void): this;... }

worker繼承自EventEmitter,并且包含了4個(gè)重要的事件:error,exit,message和online。

worker表示的是一個(gè)獨(dú)立的 JavaScript 執(zhí)行線程,我們可以通過(guò)傳遞filename或者URL來(lái)構(gòu)造worker。

每一個(gè)worker都有一對(duì)內(nèi)置的MessagePort,在worker創(chuàng)建的時(shí)候就會(huì)相互關(guān)聯(lián)。worker使用這對(duì)內(nèi)置的MessagePort來(lái)和父線程進(jìn)行通信。

通過(guò)parentPort.postMessage()發(fā)送的消息在主線程中將可以通過(guò)worker.on(‘message’)接收。

主線程中通過(guò)worker.postMessage()發(fā)送的消息將可以在工作線程中通過(guò)parentPort.on(‘message’)接收。

當(dāng)然,你也可以顯式的創(chuàng)建MessageChannel 對(duì)象,然后將MessagePort作為消息傳遞給其他線程,我們看一個(gè)例子:

const assert = require('assert'); const {Worker, MessageChannel, MessagePort, isMainThread, parentPort } = require('worker_threads'); if (isMainThread) {const worker = new Worker(__filename);const subChannel = new MessageChannel();worker.postMessage({ hereIsYourPort: subChannel.port1 }, [subChannel.port1]);subChannel.port2.on('message', (value) => {console.log('接收到:', value);}); } else {parentPort.once('message', (value) => {assert(value.hereIsYourPort instanceof MessagePort);value.hereIsYourPort.postMessage('工作線程正在發(fā)送此消息');value.hereIsYourPort.close();}); }

上面的例子中,我們借助了worker和parentPort本身的消息傳遞功能,傳遞了一個(gè)顯式的MessageChannel中的MessagePort。

然后又通過(guò)該MessagePort來(lái)進(jìn)行消息的分發(fā)。

receiveMessageOnPort

除了port的on(‘message’)方法之外,我們還可以使用receiveMessageOnPort來(lái)手動(dòng)接收消息:

const { MessageChannel, receiveMessageOnPort } = require('worker_threads'); const { port1, port2 } = new MessageChannel(); port1.postMessage({ hello: 'world' });console.log(receiveMessageOnPort(port2)); // Prints: { message: { hello: 'world' } } console.log(receiveMessageOnPort(port2)); // Prints: undefined

moveMessagePortToContext

先了解一下nodejs中的Context的概念,我們可以從vm中創(chuàng)建context,它是一個(gè)隔離的上下文環(huán)境,從而保證不同運(yùn)行環(huán)境的安全性,我們看一個(gè)context的例子:

const vm = require('vm');const x = 1;const context = { x: 2 }; vm.createContext(context); // 上下文隔離化對(duì)象。const code = 'x += 40; var y = 17;'; // `x` and `y` 是上下文中的全局變量。 // 最初,x 的值為 2,因?yàn)檫@是 context.x 的值。 vm.runInContext(code, context);console.log(context.x); // 42 console.log(context.y); // 17console.log(x); // 1; y 沒有定義。

在worker中,我們可以將一個(gè)MessagePort move到其他的context中。

worker.moveMessagePortToContext(port, contextifiedSandbox)

這個(gè)方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)就是要move的MessagePort,第二個(gè)參數(shù)就是vm.createContext()創(chuàng)建的context對(duì)象。

worker_threads的線程池

上面我們提到了使用單個(gè)的worker thread,但是現(xiàn)在程序中一個(gè)線程往往是不夠的,我們需要?jiǎng)?chuàng)建一個(gè)線程池來(lái)維護(hù)worker thread對(duì)象。

nodejs提供了AsyncResource類,來(lái)作為對(duì)異步資源的擴(kuò)展。

AsyncResource類是async_hooks模塊中的。

下面我們看下怎么使用AsyncResource類來(lái)創(chuàng)建worker的線程池。

假設(shè)我們有一個(gè)task,使用來(lái)執(zhí)行兩個(gè)數(shù)相加,腳本名字叫做task_processor.js:

const { parentPort } = require('worker_threads'); parentPort.on('message', (task) => {parentPort.postMessage(task.a + task.b); });

下面是worker pool的實(shí)現(xiàn):

const { AsyncResource } = require('async_hooks'); const { EventEmitter } = require('events'); const path = require('path'); const { Worker } = require('worker_threads');const kTaskInfo = Symbol('kTaskInfo'); const kWorkerFreedEvent = Symbol('kWorkerFreedEvent');class WorkerPoolTaskInfo extends AsyncResource {constructor(callback) {super('WorkerPoolTaskInfo');this.callback = callback;}done(err, result) {this.runInAsyncScope(this.callback, null, err, result);this.emitDestroy(); // `TaskInfo`s are used only once.} }class WorkerPool extends EventEmitter {constructor(numThreads) {super();this.numThreads = numThreads;this.workers = [];this.freeWorkers = [];for (let i = 0; i < numThreads; i++)this.addNewWorker();}addNewWorker() {const worker = new Worker(path.resolve(__dirname, 'task_processor.js'));worker.on('message', (result) => {// In case of success: Call the callback that was passed to `runTask`,// remove the `TaskInfo` associated with the Worker, and mark it as free// again.worker[kTaskInfo].done(null, result);worker[kTaskInfo] = null;this.freeWorkers.push(worker);this.emit(kWorkerFreedEvent);});worker.on('error', (err) => {// In case of an uncaught exception: Call the callback that was passed to// `runTask` with the error.if (worker[kTaskInfo])worker[kTaskInfo].done(err, null);elsethis.emit('error', err);// Remove the worker from the list and start a new Worker to replace the// current one.this.workers.splice(this.workers.indexOf(worker), 1);this.addNewWorker();});this.workers.push(worker);this.freeWorkers.push(worker);this.emit(kWorkerFreedEvent);}runTask(task, callback) {if (this.freeWorkers.length === 0) {// No free threads, wait until a worker thread becomes free.this.once(kWorkerFreedEvent, () => this.runTask(task, callback));return;}const worker = this.freeWorkers.pop();worker[kTaskInfo] = new WorkerPoolTaskInfo(callback);worker.postMessage(task);}close() {for (const worker of this.workers) worker.terminate();} }module.exports = WorkerPool;

我們給worker創(chuàng)建了一個(gè)新的kTaskInfo屬性,并且將異步的callback封裝到WorkerPoolTaskInfo中,賦值給worker.kTaskInfo.

接下來(lái)我們就可以使用workerPool了:

const WorkerPool = require('./worker_pool.js'); const os = require('os');const pool = new WorkerPool(os.cpus().length);let finished = 0; for (let i = 0; i < 10; i++) {pool.runTask({ a: 42, b: 100 }, (err, result) => {console.log(i, err, result);if (++finished === 10)pool.close();}); }

本文作者:flydean程序那些事

本文鏈接:http://www.flydean.com/nodejs-worker-thread/

本文來(lái)源:flydean的博客

歡迎關(guān)注我的公眾號(hào):「程序那些事」最通俗的解讀,最深刻的干貨,最簡(jiǎn)潔的教程,眾多你不知道的小技巧等你來(lái)發(fā)現(xiàn)!

總結(jié)

以上是生活随笔為你收集整理的nodejs中使用worker_threads来创建新的线程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

久久精品视频在线免费观看 | 久久久精品免费看 | 涩涩网站在线播放 | 成人黄色小视频 | www日日夜夜| 五月激情电影 | 国产在线播放一区二区三区 | 久久超级碰 | 天天操天天干天天 | 精品一二三区 | 婷婷丁香自拍 | 天天综合日日夜夜 | 美女免费视频网站 | 日韩精品一区二区三区免费观看 | 欧美激情视频一区二区三区免费 | 91麻豆精品国产午夜天堂 | 一二三久久久 | 欧美男男激情videos | 香蕉久久久久久av成人 | 在线视频一二区 | 91网免费看 | www.狠狠色.com | 国产原创av在线 | 干狠狠| 国产激情小视频在线观看 | 亚洲精品在线观看视频 | 日韩免费av在线 | 在线亚洲小视频 | 国内丰满少妇猛烈精品播 | 日本久久久亚洲精品 | 日韩精品你懂的 | 国产精品久久久久av免费 | 国产精品久久久久久久久搜平片 | 黄色成品视频 | 韩国三级一区 | 很黄很污的视频网站 | 国产精品一区二区免费视频 | 激情五月五月婷婷 | 国产精品av一区二区 | 久久国产精品免费一区 | ww亚洲ww亚在线观看 | 中文字幕在线观看日本 | 天天色天天综合网 | 四虎天堂 | 中文字幕亚洲国产 | 97香蕉久久超级碰碰高清版 | 五月天久久综合 | 国产乱对白刺激视频在线观看女王 | 最近2019好看的中文字幕免费 | 久久精品电影院 | 天天天综合| 一区二区精| 国产黄色观看 | 日韩免费视频一区二区 | 免费高清在线观看成人 | 日韩美一区二区三区 | 国产成人精品久久亚洲高清不卡 | 国产人成在线视频 | 亚洲一区欧美精品 | 国产精品久久久久久高潮 | 干干日日| 精品一区久久 | 日韩免费不卡av | 四虎永久网站 | 免费h在线观看 | 欧美综合色 | 香蕉久久国产 | 一区二区精品在线 | 最新av在线免费观看 | 亚洲国产精品第一区二区 | 日韩二区在线观看 | 国产精品99久久久精品免费观看 | 在线午夜| 精品一区二区在线观看 | 日韩,精品电影 | 制服丝袜在线 | 久久久久久久久久久久久影院 | 国产精品一区二区电影 | 人人爽人人乐 | 在线播放亚洲 | 婷婷九九| 国产一卡二卡四卡国 | 成年人在线免费看视频 | 国产精品成人国产乱 | 亚洲精品国| 欧美日韩免费在线观看视频 | 亚洲美女精品区人人人人 | 香蕉网址 | 久久精品123| 久草手机视频 | 成人av在线亚洲 | 亚洲精品男人的天堂 | 亚洲精品乱码久久久久久蜜桃动漫 | 黄色大片免费播放 | 久久久国产精品人人片99精片欧美一 | 色噜噜日韩精品一区二区三区视频 | 最近乱久中文字幕 | 久久99久国产精品黄毛片入口 | 一区二区三区四区不卡 | 免费观看的黄色 | 国产在线精品福利 | 九九视频在线观看视频6 | 日韩免费福利 | 91九色蝌蚪国产 | 国产系列精品av | 日韩专区中文字幕 | 亚洲国产精品资源 | 久久综合久久久久88 | 日韩在线激情 | 九色精品免费永久在线 | 狠狠色综合欧美激情 | 在线观看mv的中文字幕网站 | 国产伦理一区二区 | 开心激情网五月天 | 亚洲视频精品在线 | 豆豆色资源网xfplay | 激情综合色图 | 中文久久精品 | 久久国产精品免费视频 | 在线免费观看麻豆视频 | 超碰人人乐 | 开心激情网五月天 | 在线免费观看的av网站 | 久久精品国产一区二区三 | 欧美成人精品三级在线观看播放 | 久久午夜网 | 午夜久久久久久久久久久 | 久久亚洲私人国产精品va | 看av在线| 免费看黄色毛片 | 97色免费视频 | 四虎永久网站 | 久久综合九色综合欧美狠狠 | 99久久精品免费视频 | 成人国产精品久久久 | 成人av电影在线观看 | 国产精品69久久久久 | 国产精品乱码一区二三区 | 国产免费区 | 天天色天天骑天天射 | 91视频91色| 美女网站色 | 国产色拍拍拍拍在线精品 | 亚洲欧洲成人 | 国产精品免费在线视频 | 国产无吗一区二区三区在线欢 | 亚洲欧美国产日韩在线观看 | 波多野结衣在线观看一区二区三区 | 天天爱综合 | 久久精品亚洲一区二区三区观看模式 | 亚洲色图27p | 玖玖玖精品| 精品国产一区二区三区不卡 | 97精品国产91久久久久久久 | 91日韩在线视频 | 超碰在线最新网址 | 久久www免费视频 | 中文字幕亚洲欧美 | 国语久久| 韩日视频在线 | 免费在线91| 国产精品6999成人免费视频 | 永久免费毛片在线观看 | 国产麻豆果冻传媒在线观看 | 欧美亚洲xxx | 视频一区二区视频 | 国产黄在线免费观看 | 久久精品999 | 精品久久99 | 97视频人人免费看 | 91丨九色丨国产在线 | 一区二区三区高清 | 97视频亚洲 | 欧美一级特黄高清视频 | 色婷婷六月天 | 91成人欧美 | 欧美巨大| 成人羞羞视频在线观看免费 | 国产精品久久久久久久久久久久久久 | 天天天天天天干 | 成年人免费看片网站 | 久久男人中文字幕资源站 | 欧美一级免费 | 精品亚洲成人 | 国产精品精品国产色婷婷 | 国产精品理论片在线观看 | 日韩美视频 | 91成人精品一区在线播放69 | 97在线免费观看 | 亚洲 欧美 国产 va在线影院 | 毛片永久免费 | 久草网在线观看 | 中文字幕在线观看三区 | 亚洲国产伊人 | 亚洲精品在线免费看 | 久久久久亚洲天堂 | 黄色a大片 | 日韩av一区二区三区 | 在线观看你懂的网站 | 欧美日韩裸体免费视频 | 中文乱幕日产无线码1区 | 国产视频中文字幕 | 啪一啪在线 | 日本在线视频网址 | 四虎成人精品在永久免费 | 一区二区激情 | 色婷婷视频 | 久久久综合精品 | 人人草人 | 免费一级特黄毛大片 | 亚洲成人精品在线观看 | 欧美极品少妇xxxx | 九九精品在线观看 | www.91av在线| 亚洲综合精品视频 | 久草综合在线观看 | 久久激情视频 久久 | 涩av在线 | www欧美色| 国产一级黄色免费看 | 在线观看免费av网 | 欧美 日韩 国产 中文字幕 | 国产女人18毛片水真多18精品 | 在线观看色网站 | 国产天天综合 | 午夜aaaa| 日韩二区在线观看 | 国产色女 | 免费看污网站 | 丝袜美女在线 | 免费网站观看www在线观看 | 国产a级精品 | 久久99热这里只有精品 | 国产成人在线免费观看 | 欧美日韩精品在线播放 | 黄色毛片视频免费观看中文 | 国产精品国产三级国产aⅴ无密码 | av片在线观看免费 | 丁香视频全集免费观看 | 中文字幕麻豆 | 69国产精品视频免费观看 | 成人h电影 | 亚洲精品xxx | 狠狠狠狠狠狠 | 中文字幕免费在线 | 欧美日本在线视频 | 国产黄色免费在线观看 | 99视频精品免费视频 | 久章草在线观看 | 99热在| 久久精品视频网址 | 玖玖在线精品 | 国产成人精品一区二区 | www.玖玖玖 | 国产精品免费不卡 | 97av在线| a黄色影院| 国产精品video | 国产99亚洲| 国产精品视频永久免费播放 | 久草在线免费看视频 | 色丁香综合 | 免费看久久 | 精品国产aⅴ麻豆 | 永久免费毛片 | 亚洲黄色av一区 | 99久久www| 久久视频国产精品免费视频在线 | 亚洲色图27p | 99久久婷婷国产综合精品 | 中文字幕亚洲精品在线观看 | 欧美激情综合五月色丁香 | av中文字幕网站 | 日韩在线观看中文字幕 | 国产精品乱码久久久久 | 中文av字幕在线观看 | 日韩在线视频观看 | 日韩在线视频看看 | 日韩av中文字幕在线免费观看 | 亚州精品国产 | 麻豆极品 | 亚洲精品乱码久久久久久久久久 | 亚洲欧美激情精品一区二区 | 99久久精品国产亚洲 | 日韩欧美在线高清 | 美女网站视频免费都是黄 | 国产福利在线 | 国产成人在线免费观看 | 狠狠狠综合 | 中文字幕免费 | 99婷婷狠狠成为人免费视频 | 欧美视频网址 | 国产成人一区二区三区久久精品 | 在线成人av | 2022中文字幕在线观看 | 国产精品毛片久久蜜 | 国产成人一区二区三区影院在线 | 久久中文欧美 | 叶爱av在线| 精品一二三区 | 久久天堂精品视频 | 亚洲精品视频在线播放 | 成人午夜电影免费在线观看 | 天天鲁一鲁摸一摸爽一爽 | av网站在线免费观看 | 日本久久久久久 | 久久久久久久久久伊人 | 国产aaa毛片| 久久久免费毛片 | 国产性xxxx| 国产一区二区影院 | 亚洲日韩欧美视频 | 天天操欧美| 国产精品欧美久久久久无广告 | 欧美性生活免费看 | 久综合网| 99在线精品视频 | 在线视频久久 | 色中文字幕在线观看 | 久久久久亚洲精品成人网小说 | 成人欧美日韩国产 | 久久一区二区三区国产精品 | 91精品国产91久久久久福利 | 中国精品一区二区 | 免费观看www7722午夜电影 | 欧美日韩一级在线 | 亚洲最快最全在线视频 | 片黄色毛片黄色毛片 | 久章操 | 久久久久在线观看 | 一区二区三区日韩视频在线观看 | 亚洲影视九九影院在线观看 | 亚洲va欧美| 欧美日韩中文视频 | 一区三区在线欧 | 国产精品久久久久久69 | 日本一区二区高清不卡 | 精品一区二区在线看 | 天天插天天 | 日韩中文字幕在线看 | 一区中文字幕电影 | 日韩av视屏在线观看 | www.888av| 九九免费在线视频 | 免费在线成人av电影 | 特级毛片aaa | 国产美女永久免费 | 亚洲激情中文 | 中文字幕超清在线免费 | 久草亚洲视频 | 日韩欧美在线第一页 | 日韩av电影一区 | 欧美韩国日本在线 | 亚洲视频1| 欧美午夜a | 天天射综合网站 | 91人人爽久久涩噜噜噜 | 国产精品欧美久久久久天天影视 | 激情视频综合网 | 久草网视频在线观看 | 一区二区三区手机在线观看 | 欧美日韩在线观看一区 | 欧美日韩国产在线精品 | 在线观看日韩中文字幕 | 国产成人一区二区三区在线观看 | 国产一区在线视频观看 | 西西444www大胆高清图片 | 日本中出在线观看 | 久久国产精品久久w女人spa | 久久久免费毛片 | 精品久久久久久一区二区里番 | 国产黄色一级片在线 | 国产69精品久久99的直播节目 | 日本中文字幕在线观看 | 国产高清综合 | 成年人免费在线观看网站 | av电影免费看 | 日韩免费视频网站 | 亚洲午夜精品一区 | 中文字幕免费高清av | 国产精品久久久久婷婷二区次 | 99久免费精品视频在线观看 | 色婷婷狠狠五月综合天色拍 | 亚洲综合欧美激情 | 精品美女国产在线 | 色婷婷狠狠五月综合天色拍 | 天天天天色综合 | 国产高清视频在线免费观看 | 在线免费观看黄色 | 亚洲精品一区二区在线观看 | 久久夜色电影 | 国产精品入口久久 | 人人澡人人草 | 最新av免费在线 | wwxxx日本 | 中文字幕一区二区三区久久蜜桃 | 免费在线观看a v | 亚洲无吗av| 在线观看精品国产 | 国产一及片 | 激情综合色图 | 国产高清视频免费在线观看 | 激情五月在线观看 | 国产一区二区视频在线播放 | 欧美亚洲久久 | 超碰国产在线观看 | 欧美va天堂va视频va在线 | 在线天堂视频 | 在线观看麻豆av | 欧美一区日韩精品 | 日韩一区二区三区视频在线 | 久久久免费精品国产一区二区 | 久草在线免费新视频 | 国产69精品久久久久久久久久 | 特级西西人体444是什么意思 | 香蕉久久国产 | 99久高清在线观看视频99精品热在线观看视频 | 欧美精品久久久久久久免费 | 97成人资源站 | 久草在线中文视频 | 国产二区视频在线 | 欧美日韩在线精品一区二区 | 精品在线二区 | 欧美性视频网站 | 亚洲一级片免费观看 | 在线免费观看视频一区二区三区 | 操高跟美女 | 久久国产美女视频 | 四虎影视精品成人 | 成人在线网站观看 | 麻豆av一区二区三区在线观看 | 久久免费一 | 久久伊人国产精品 | 成人在线播放av | 色婷婷狠狠五月综合天色拍 | 久久久麻豆视频 | 亚洲国产欧洲综合997久久, | 国产尤物在线 | 日韩激情小视频 | 亚洲乱码久久久 | 国产99久久久国产精品成人免费 | 国产又粗又猛又黄视频 | 国产成人免费在线观看 | 亚洲视频1区2区 | 亚洲国产精品视频在线观看 | 久久成人精品电影 | 美女视频黄免费的 | 欧美久久久久久久久久久久 | 涩涩爱夜夜爱 | 久久艹免费 | 国产高清 不卡 | 久草在线一免费新视频 | 一二区电影 | 国产一级特黄电影 | 久久精品视频在线观看免费 | 韩国av三级 | 91福利影院在线观看 | 天天色欧美 | 中文在线字幕免费观看 | 日韩欧美高清在线观看 | 91| 久久久久成人精品免费播放动漫 | 日b视频在线观看网址 | 伊人色**天天综合婷婷 | 国产极品尤物在线 | 99久久久久免费精品国产 | 黄色三级在线看 | 亚洲精品456在线播放乱码 | 五月婷婷视频在线 | 9999精品视频 | 国产高清99 | 九九九九免费视频 | 综合网伊人 | 色播五月激情五月 | 久久久久久国产精品亚洲78 | 99久久超碰中文字幕伊人 | 激情视频在线观看网址 | 日本护士三级少妇三级999 | 91亚洲国产成人久久精品网站 | 欧美日本啪啪无遮挡网站 | 成人在线观看免费视频 | 国产高清成人在线 | 国产手机在线播放 | 黄色中文字幕 | 在线影视 一区 二区 三区 | 午夜精品一二区 | 美女精品 | 欧美综合在线观看 | 精品一区二区在线观看 | 黄色片免费电影 | 国内精品一区二区 | 国产在线视频一区二区 | 色婷婷亚洲 | 国产一区二区在线看 | 成人在线免费观看视视频 | 福利片免费看 | 色播六月天 | 国产99久久久国产精品免费看 | 欧美激情亚洲综合 | 天天综合亚洲 | 国产精品岛国久久久久久久久红粉 | av大片网址 | 精品久久久久久久久久久久久久久久 | 国产在线无 | 日本xxxxav| av在线播放国产 | 一级a毛片高清视频 | 99久久精品视频免费 | 91在线porny国产在线看 | 免费网站观看www在线观看 | 国产精品精 | 成人av在线直播 | 超碰人人99| 国产精品夜夜夜一区二区三区尤 | 国产一区二区在线视频观看 | 国产精品www| 久久久久久久久久久黄色 | 国产成人精品一区二区 | 黄色成人小视频 | 婷婷日| 日本久久久久久久久 | 国产精品初高中精品久久 | 精品一区 在线 | 91精品国产福利在线观看 | 久久99国产精品免费 | 久久免费视频2 | 久久免费电影网 | 国产精品久久久久久av | 国产黄色精品在线 | 91av在线免费播放 | 在线看福利av | 国偷自产视频一区二区久 | 国产免费影院 | 最近中文字幕视频完整版 | 久av电影 | 国内视频在线观看 | 亚洲天天摸日日摸天天欢 | 欧美一区免费观看 | 国产精品99久久久久久久久久久久 | 高清视频一区 | www.在线看片.com | 亚洲国产激情 | 日日操夜夜操狠狠操 | 久草视频在线免费播放 | 狠狠操天天干 | 91av资源网| 国产精品高潮呻吟久久av无 | 国产精品亚洲成人 | 麻豆久久精品 | 97精品国产91久久久久久 | 日韩三级免费观看 | 国产精品综合在线观看 | 国产成人黄色网址 | 香蕉网在线播放 | 国产91在线 | 美洲 | 黄色在线免费观看网址 | 亚洲精品国产电影 | 国产一级特黄毛片在线毛片 | 成人超碰97 | 久久香蕉影视 | 免费高清男女打扑克视频 | 成年人视频在线免费观看 | 欧美 日韩 视频 | 国产一二三四在线观看视频 | 日韩在观看线 | av大片网站 | 99精品在线免费观看 | av免费看av | 伊色综合久久之综合久久 | 亚洲自拍自偷 | 日本免费久久高清视频 | 婷婷色在线| 欧美日韩国产综合网 | 丁香六月伊人 | 永久免费看av | 狠狠干天天 | 热久久免费视频 | 在线一二三四区 | 亚洲日本黄色 | 色哟哟国产精品 | 西西444www大胆高清图片 | 久人人 | 久久久久久久久国产 | 午夜影院一区 | 免费高清在线一区 | 国色综合 | 中文字幕乱在线伦视频中文字幕乱码在线 | 亚洲人成综合 | 亚洲人成精品久久久久 | 韩国av免费观看 | 欧美成人黄色片 | 国产一级一级国产 | 性色在线视频 | 精品视频一区在线观看 | 婷婷精品 | 99在线视频精品 | 91探花系列在线播放 | 国产一在线精品一区在线观看 | 在线视频一二三 | 精品国产诱惑 | 激情黄色一级片 | 国产福利在线不卡 | 人人爽人人爽人人 | 亚洲国产资源 | 亚洲极色 | 欧美日韩中文字幕综合视频 | www五月婷婷| 美女亚洲精品 | 国产美女免费看 | av丝袜在线| 日日草av | 久久黄色影视 | 午夜精品久久久久久久久久久久久久 | 91中文字幕在线观看 | 国产视频一区二区在线播放 | 久久久久欠精品国产毛片国产毛生 | 69视频永久免费观看 | 国产成人精品电影久久久 | 久久精品欧美视频 | 九九热只有精品 | 国内精品久久久久久 | 国产精品成人免费一区久久羞羞 | 日韩黄色在线观看 | 欧美成人在线免费 | 麻豆国产电影 | 午夜av不卡 | 日韩首页 | 日韩欧美高清视频在线观看 | 91成版人在线观看入口 | 国产这里只有精品 | 亚洲三级在线免费观看 | 中文字幕a∨在线乱码免费看 | 久久99精品久久久久久清纯直播 | 日韩在线免费观看视频 | 欧美夫妻性生活电影 | 91麻豆精品国产自产 | 五月开心婷婷网 | 色吊丝在线永久观看最新版本 | 国产高清区 | 久操久| 国产福利91精品张津瑜 | 国产一级二级在线播放 | 成人欧美在线 | 二区视频在线观看 | 五月天丁香 | 国产精品一区二区av | 国产超碰在线 | 日本论理电影 | 国产精品黄网站在线观看 | 91精品小视频 | 成人在线超碰 | 99视频免费 | 中文字幕亚洲欧美日韩 | 91看国产| 亚洲免费一级电影 | 国产精品欧美日韩在线观看 | 综合网中文字幕 | 黄污污网站| 天天射天天射天天 | 成人av在线播放网站 | 伊人开心激情 | 亚洲免费在线视频 | 久久黄色免费观看 | 欧美另类激情 | 91中文字幕在线视频 | 五月天堂色 | 久久国产午夜精品理论片最新版本 | 奇米网444| 区一区二区三区中文字幕 | 精品国产123 | 久久免费视频在线 | www.国产精品 | 精品国产乱码久久久久久1区二区 | 九九热精品视频在线观看 | 观看免费av | 91丨九色丨国产丨porny精品 | 97在线观看视频国产 | 97在线观看免费观看高清 | a久久免费视频 | 91探花在线 | 亚洲无人区小视频 | 亚洲在线a | 国产一区二区视频在线播放 | 久久久久成 | 欧美日韩观看 | av在线色 | 国产精品自产拍在线观看蜜 | 精品一区二区av | 日韩视频1区 | 九九九九色 | 九月婷婷人人澡人人添人人爽 | 亚洲一区二区三区miaa149 | 久久精品99国产精品酒店日本 | 在线视频亚洲 | www.五月天色 | 精品视频国产一区 | 成人在线免费观看视视频 | 国产伦理一区二区 | 欧美一区三区四区 | 日日操夜 | 91精品综合在线观看 | 99999精品 | 免费看的av片 | 国产拍揄自揄精品视频麻豆 | 91人人插 | 999久久a精品合区久久久 | 麻豆国产精品一区二区三区 | 在线色吧 | 麻豆传媒视频在线免费观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 国产999精品久久久影片官网 | 中文字幕xxxx | 青草草在线视频 | 欧美综合干| 51久久成人国产精品麻豆 | 91av视频播放 | 久久www免费人成看片高清 | 狠狠色丁香婷婷综合橹88 | 亚洲精品在线国产 | 91在线看视频 | 97精品国产97久久久久久久久久久久 | 精品视频国产一区 | 在线看岛国av | 99精品电影 | 国产色婷婷在线 | 狠日日 | 国产日韩精品一区二区在线观看播放 | 99 精品 在线 | av在线之家电影网站 | 久久久免费观看 | 国产精品手机在线观看 | 96精品视频 | 黄色一级大片免费看 | 欧美日韩视频免费 | 日韩电影中文字幕在线 | 一级a性色生活片久久毛片波多野 | 不卡的av | 日本久久综合视频 | 欧美激情精品久久久久久 | 国内99视频 | 四虎www com | 日本性生活免费看 | www.天天草| 天天在线视频色 | 日韩精品一区二区三区中文字幕 | 日韩视频在线不卡 | 国产亚洲婷婷免费 | 亚洲 成人 欧美 | 欧美不卡视频在线 | 在线不卡中文字幕播放 | 久章草在线观看 | 久久久久久国产精品久久 | 中文字幕影片免费在线观看 | 日韩电影一区二区在线观看 | 在线 国产 亚洲 欧美 | 天天做天天干 | 超碰精品在线 | 国产成人免费观看久久久 | 狠狠操操网| 久久精品综合视频 | 久久精品视频网站 | 欧美日韩一区二区三区在线观看视频 | 在线视频你懂 | 99久久精品免费看国产四区 | 国产夫妻av在线 | 蜜臀aⅴ精品一区二区三区 久久视屏网 | 夜夜视频 | 精品99免费 | 精品一二三四在线 | 日韩欧美在线观看一区二区 | 日韩视频精品在线 | 超级碰碰免费视频 | 久久成人毛片 | 日日干美女 | 日韩欧美网址 | 成人网在线免费视频 | 91在线视频播放 | 国产日韩精品在线观看 | 成人综合日日夜夜 | 婷婷六月色 | 欧美日韩国产三级 | 日韩视频免费看 | 91久久精品一区二区三区 | 久久噜噜少妇网站 | 狠狠操精品 | 国产亚洲午夜高清国产拍精品 | 国产精品18久久久久久vr | 国产人免费人成免费视频 | 国产高清久久久久 | 99久免费精品视频在线观看 | 国产在线不卡一区 | 成人91在线观看 | 亚洲一区二区视频在线 | 天天翘av | 久久婷婷色综合 | 美女av免费看 | 日本视频网 | 久久久久女人精品毛片九一 | 97成人精品视频在线观看 | av在线观 | 国产亚洲精品xxoo | 成年人黄色在线观看 | 四虎影视av| 97视频播放| 国产成人精品a | 97香蕉久久国产在线观看 | 成人黄色电影在线播放 | 久草网视频 | 婷婷在线免费观看 | 成年人app网址 | 色狠狠综合 | 最新国产精品亚洲 | 三三级黄色片之日韩 | 天堂av免费在线 | 最近的中文字幕大全免费版 | 女人18精品一区二区三区 | 国产精品露脸在线 | 精品国产亚洲在线 | 在线观看av小说 | 国产精品毛片久久久久久久久久99999999 | 国产99久久久国产精品免费看 | 国产精品视屏 | 怡春院av | 国产色就色 | 91人人人| 黄色在线观看网站 | 成人午夜电影久久影院 | 日本久久中文 | 在线免费观看视频你懂的 | 91精品国产91久久久久久三级 | 日韩在线字幕 | 日韩毛片久久久 | 国产成人三级在线 | 国语精品久久 | 在线免费黄 | 五月天天色 | 国产精品免费一区二区三区 | 久热爱 | 久射网| 美女视频黄免费网站 | 黄网站a| 欧美成人aa| 欧美日韩国产亚洲乱码字幕 | 日韩av不卡在线观看 | 三级黄色欧美 | 国产韩国精品一区二区三区 | 久久免费视频在线观看 | 成人av在线直播 | 视频一区亚洲 | 免费看成年人 | 国内三级在线观看 | av福利在线看 | 色网影音先锋 | 亚洲高清久久久 | 中文字幕文字幕一区二区 | 97视频在线播放 | 99久在线精品99re8热视频 | 日韩网站免费观看 | 精品一二三区 | 欧美日韩在线观看一区 | 69国产精品视频免费观看 | 国产成人免费 | 国产污视频在线观看 | 日韩成人免费观看 | 啪啪小视频网站 | 91福利视频久久久久 | 一级久久久 | 国产无限资源在线观看 | 久久久这里有精品 | 美女精品久久久 | 日韩av在线免费播放 | 免费网站在线观看成人 | 狠狠久久伊人 | 人人爽人人舔 | 国产在线1区 | 四虎在线视频免费观看 | 亚洲天天在线日亚洲洲精 | 91网站观看| 久久三级毛片 | 四虎成人在线 | 国产精品18毛片一区二区 | 麻豆视频在线免费看 | 欧美久久影院 | 黄色免费在线视频 | 五月天久久综合网 | 欧美一级特黄aaaaaa大片在线观看 | 在线中文字幕视频 | 亚洲精品在线视频 | 伊人国产在线播放 | 亚洲精品在线观看视频 | 天天操比| 色婷婷福利视频 | 久久精品资源 | www.xxx.性狂虐| 国产在线观看黄 | 国产精品小视频网站 | 国产精品女 | 91精品视频网站 | 精品一区二区在线观看 | 手机看片中文字幕 | 国产精品 中文在线 | 国产精品精品国产 | 91最新在线视频 | 日韩高清不卡一区二区三区 | 国产在线播放一区二区三区 | 国产视频精品久久 | 久草新在线 | 国产一级三级 | 久草97| 九九色在线 | 2022久久国产露脸精品国产 | 91麻豆精品国产91久久久久久久久 | 久久精品一区二区三 | 日本精a在线观看 | 精品久久久久久综合 | 中文字幕日韩免费视频 | 久草在线资源网 | 欧美性生交大片免网 | 六月婷操 | 狠狠色丁香婷婷综合橹88 | 久久免费激情视频 | 五月导航| 久久人人爽 | 超级碰碰碰免费视频 | 在线 你懂| 五月激情综合婷婷 | 日韩高清av在线 | 国产专区在线看 | 久久6精品 | 国产资源在线视频 | 久久a久久 | 亚洲精品一区二区久 | 操操操人人人 | 一区二区三区免费看 | 久久午夜免费视频 | 91视频88av| 夜夜骑首页 | 国产中文字幕一区二区 | 中文国产字幕 | 成人av免费| 欧美a级成人淫片免费看 | 国产一级免费视频 | 黄色av网站在线观看免费 | 中文字幕资源在线观看 | 免费三级在线 | 国产一级高清 | 日韩午夜电影院 | 日韩av播放在线 | 天天干天天操天天干 | 久久精品成人热国产成 | 婷婷六月综合网 | 欧美一区二区免费在线观看 | 国产亚洲va综合人人澡精品 | 97免费在线观看视频 | 国产在线观看地址 | 国产999久久久 | 高潮毛片无遮挡高清免费 | 六月丁香激情综合色啪小说 | 波多野结依在线观看 | 成人亚洲精品国产www | 在线观看国产中文字幕 | 日本久久成人 | 久久99热精品这里久久精品 | 91最新网址 | 国内精品视频一区二区三区八戒 | 黄色看片| 亚洲区二区 | av在线h| 日日夜精品| 91香蕉视频720p| 中文日韩在线视频 | 久久天堂精品视频 | 日韩av电影免费在线观看 | freejavvideo日本免费| 久久久国产成人 | 国产精品成人一区二区 | 成人黄色电影在线播放 | 99免费视频| 国产伦精品一区二区三区在线 | 中文字幕黄网 | 国产一区二区在线播放 | 久久精品艹 | 久久精品99视频 | 亚洲欧美精品一区二区 | 久久国产精品免费看 | 亚洲视频 视频在线 | 精品亚洲在线 | 中文字幕一区二区三区四区 | 久久av网址| 天天射天天做 | 欧美激情在线网站 | 天天插综合网 | 日免费视频 | 亚洲国产日韩一区 | 在线精品亚洲一区二区 | 久久精品欧美 | 国产成人久久精品一区二区三区 | 午夜精品久久久久久久久久久久 |