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

你知道神奇的弱引用嗎

開(kāi)發(fā) 前端
因?yàn)?Data 一旦被創(chuàng)建后,就保存在緩存字典中,永遠(yuǎn)都不會(huì)釋放!換句話講,程序的資源比如內(nèi)存,會(huì)不斷地增長(zhǎng),最終很有可能會(huì)爆掉。因此,我們希望一個(gè)數(shù)據(jù)等所有線程都不再訪問(wèn)后,能夠自動(dòng)釋放。

 [[427639]]

本文轉(zhuǎn)載自微信公眾號(hào)「小菜學(xué)編程」,作者fasionchan。轉(zhuǎn)載本文請(qǐng)聯(lián)系小菜學(xué)編程公眾號(hào)。

背景

開(kāi)始討論弱引用( weakref )之前,我們先來(lái)看看什么是弱引用?它到底有什么作用?

假設(shè)我們有一個(gè)多線程程序,并發(fā)處理應(yīng)用數(shù)據(jù):

  1. # 占用大量資源,創(chuàng)建銷(xiāo)毀成本很高 
  2. class Data: 
  3.     def __init__(self, key): 
  4.         pass 

應(yīng)用數(shù)據(jù) Data 由一個(gè) key 唯一標(biāo)識(shí),同一個(gè)數(shù)據(jù)可能被多個(gè)線程同時(shí)訪問(wèn)。由于 Data 需要占用很多系統(tǒng)資源,創(chuàng)建和消費(fèi)的成本很高。我們希望 Data 在程序中只維護(hù)一個(gè)副本,就算被多個(gè)線程同時(shí)訪問(wèn),也不想重復(fù)創(chuàng)建。

為此,我們嘗試設(shè)計(jì)一個(gè)緩存中間件 Cacher :

  1. import threading 
  2. # 數(shù)據(jù)緩存 
  3. class Cacher: 
  4.     def __init__(self): 
  5.         self.pool = {} 
  6.         self.lock = threading.Lock() 
  7.     def get(self, key): 
  8.         with self.lock: 
  9.             data = self.pool.get(key
  10.             if data: 
  11.                 return data 
  12.             self.pool[key] = data = Data(key
  13.             return data 

Cacher 內(nèi)部用一個(gè) dict 對(duì)象來(lái)緩存已創(chuàng)建的 Data 副本,并提供 get 方法用于獲取應(yīng)用數(shù)據(jù) Data 。get 方法獲取數(shù)據(jù)時(shí)先查緩存字典,如果數(shù)據(jù)已存在,便直接將其返回;如果數(shù)據(jù)不存在,則創(chuàng)建一個(gè)并保存到字典中。因此,數(shù)據(jù)首次被創(chuàng)建后就進(jìn)入緩存字典,后續(xù)如有其它線程同時(shí)訪問(wèn),使用的都是緩存中的同一個(gè)副本。

感覺(jué)非常不錯(cuò)!但美中不足的是:Cacher 有資源泄露的風(fēng)險(xiǎn)!

因?yàn)?Data 一旦被創(chuàng)建后,就保存在緩存字典中,永遠(yuǎn)都不會(huì)釋放!換句話講,程序的資源比如內(nèi)存,會(huì)不斷地增長(zhǎng),最終很有可能會(huì)爆掉。因此,我們希望一個(gè)數(shù)據(jù)等所有線程都不再訪問(wèn)后,能夠自動(dòng)釋放。

我們可以在 Cacher 中維護(hù)數(shù)據(jù)的引用次數(shù), get 方法自動(dòng)累加這個(gè)計(jì)數(shù)。于此同時(shí)提供一個(gè) remove 新方法用于釋放數(shù)據(jù),它先自減引用次數(shù),并在引用次數(shù)降為零時(shí)將數(shù)據(jù)從緩存字段中刪除。

線程調(diào)用 get 方法獲取數(shù)據(jù),數(shù)據(jù)用完后需要調(diào)用 remove 方法將其釋放。Cacher 相當(dāng)于自己也實(shí)現(xiàn)了一遍引用計(jì)數(shù)法,這也太麻煩了吧!Python 不是內(nèi)置了垃圾回收機(jī)制嗎?為什么應(yīng)用程序還需要自行實(shí)現(xiàn)呢?

沖突的主要癥結(jié)在于 Cacher 的緩存字典:它作為一個(gè)中間件,本身并不使用數(shù)據(jù)對(duì)象,因此理論上不應(yīng)該對(duì)數(shù)據(jù)產(chǎn)生引用。那有什么黑科技能夠在不產(chǎn)生引用的前提下,找到目標(biāo)對(duì)象嗎?我們知道,賦值都是會(huì)產(chǎn)生引用的!

典型用法

這時(shí),弱引用( weakref )隆重登場(chǎng)了!弱引用是一種特殊的對(duì)象,能夠在不產(chǎn)生引用的前提下,關(guān)聯(lián)目標(biāo)對(duì)象。

  1. # 創(chuàng)建一個(gè)數(shù)據(jù) 
  2. >>> d = Data('fasionchan.com'
  3. >>> d 
  4. <__main__.Data object at 0x1018571f0> 
  5.  
  6. # 創(chuàng)建一個(gè)指向該數(shù)據(jù)的弱引用 
  7. >>> import weakref 
  8. >>> r = weakref.ref(d) 
  9.  
  10. # 調(diào)用弱引用對(duì)象,即可找到指向的對(duì)象 
  11. >>> r() 
  12. <__main__.Data object at 0x1018571f0> 
  13. >>> r() is d 
  14. True 
  15.  
  16. # 刪除臨時(shí)變量d,Data對(duì)象就沒(méi)有其他引用了,它將被回收 
  17. >>> del d 
  18. # 再次調(diào)用弱引用對(duì)象,發(fā)現(xiàn)目標(biāo)Data對(duì)象已經(jīng)不在了(返回None) 
  19. >>> r() 

這樣一來(lái),我們只需將 Cacher 緩存字典改成保存弱引用,問(wèn)題便迎刃而解!

  1. import threading 
  2. import weakref 
  3. # 數(shù)據(jù)緩存 
  4. class Cacher: 
  5.     def __init__(self): 
  6.         self.pool = {} 
  7.         self.lock = threading.Lock() 
  8.     def get(self, key): 
  9.         with self.lock: 
  10.             r = self.pool.get(key
  11.             if r: 
  12.                 data = r() 
  13.                 if data: 
  14.                     return data 
  15.             data = Data(key
  16.             self.pool[key] = weakref.ref(data) 
  17.             return data 

由于緩存字典只保存 Data 對(duì)象的弱引用,因此 Cacher 不會(huì)影響 Data 對(duì)象的引用計(jì)數(shù)。當(dāng)所有線程都用完數(shù)據(jù)后,引用計(jì)數(shù)就降為零因而被釋放。

實(shí)際上,用字典緩存數(shù)據(jù)對(duì)象的做法很常用,為此 weakref 模塊還提供了兩種只保存弱引用的字典對(duì)象:

  • weakref.WeakKeyDictionary ,鍵只保存弱引用的映射類(lèi)(一旦鍵不再有強(qiáng)引用,鍵值對(duì)條目將自動(dòng)消失);
  • weakref.WeakValueDictionary ,值只保存弱引用的映射類(lèi)(一旦值不再有強(qiáng)引用,鍵值對(duì)條目將自動(dòng)消失);

因此,我們的數(shù)據(jù)緩存字典可以采用 weakref.WeakValueDictionary 來(lái)實(shí)現(xiàn),它的接口跟普通字典完全一樣。這樣我們不用再自行維護(hù)弱引用對(duì)象,代碼邏輯更加簡(jiǎn)潔明了:

  1. import threading 
  2. import weakref 
  3. # 數(shù)據(jù)緩存 
  4. class Cacher: 
  5.     def __init__(self): 
  6.         self.pool = weakref.WeakValueDictionary() 
  7.         self.lock = threading.Lock() 
  8.     def get(self, key): 
  9.         with self.lock: 
  10.             data = self.pool.get(key
  11.             if data: 
  12.                 return data 
  13.             self.pool[key] = data = Data(key
  14.             return data 

weakref 模塊還有很多好用的工具類(lèi)和工具函數(shù),具體細(xì)節(jié)請(qǐng)參考官方文檔,這里不再贅述。

工作原理

那么,弱引用到底是何方神圣,為什么會(huì)有如此神奇的魔力呢?接下來(lái),我們一起揭下它的面紗,一睹真容!

  1. >>> d = Data('fasionchan.com'
  2.  
  3. # weakref.ref 是一個(gè)內(nèi)置類(lèi)型對(duì)象 
  4. >>> from weakref import ref 
  5. >>> ref 
  6. <class 'weakref'
  7.  
  8. # 調(diào)用weakref.ref類(lèi)型對(duì)象,創(chuàng)建了一個(gè)弱引用實(shí)例對(duì)象 
  9. >>> r = ref(d) 
  10. >>> r 
  11. <weakref at 0x1008d5b80; to 'Data' at 0x100873d60> 

經(jīng)過(guò)前面章節(jié),我們對(duì)閱讀內(nèi)建對(duì)象源碼已經(jīng)輕車(chē)熟路了,相關(guān)源碼文件如下:

  • Include/weakrefobject.h 頭文件包含對(duì)象結(jié)構(gòu)體和一些宏定義;
  • Objects/weakrefobject.c 源文件包含弱引用類(lèi)型對(duì)象及其方法定義;

我們先扒一扒弱引用對(duì)象的字段結(jié)構(gòu),定義于 Include/weakrefobject.h 頭文件中的第 10-41 行:

  1. typedef struct _PyWeakReference PyWeakReference; 
  2.  
  3. /* PyWeakReference is the base struct for the Python ReferenceType, ProxyType, 
  4.  * and CallableProxyType. 
  5.  */ 
  6. #ifndef Py_LIMITED_API 
  7. struct _PyWeakReference { 
  8.     PyObject_HEAD 
  9.  
  10.     /* The object to which this is a weak reference, or Py_None if none. 
  11.      * Note that this is a stealth reference:  wr_object's refcount is 
  12.      * not incremented to reflect this pointer. 
  13.      */ 
  14.     PyObject *wr_object; 
  15.  
  16.     /* A callable to invoke when wr_object dies, or NULL if none. */ 
  17.     PyObject *wr_callback; 
  18.  
  19.     /* A cache for wr_object's hash code.  As usual for hashes, this is -1 
  20.      * if the hash code isn't known yet. 
  21.      */ 
  22.     Py_hash_t hash; 
  23.  
  24.     /* If wr_object is weakly referenced, wr_object has a doubly-linked NULL
  25.      * terminated list of weak references to it.  These are the list pointers. 
  26.      * If wr_object goes away, wr_object is set to Py_None, and these pointers 
  27.      * have no meaning then
  28.      */ 
  29.     PyWeakReference *wr_prev; 
  30.     PyWeakReference *wr_next; 
  31. }; 
  32. #endif 

由此可見(jiàn),PyWeakReference 結(jié)構(gòu)體便是弱引用對(duì)象的肉身。它是一個(gè)定長(zhǎng)對(duì)象,除固定頭部外還有 5 個(gè)字段:

  • wr_object ,對(duì)象指針,指向被引用對(duì)象,弱引用根據(jù)該字段可以找到被引用對(duì)象,但不會(huì)產(chǎn)生引用;
  • wr_callback ,指向一個(gè)可調(diào)用對(duì)象,當(dāng)被引用的對(duì)象銷(xiāo)毀時(shí)將被調(diào)用;
  • hash ,緩存被引用對(duì)象的哈希值;
  • wr_prev 和 wr_next 分別是前后向指針,用于將弱引用對(duì)象組織成雙向鏈表;

結(jié)合代碼中的注釋?zhuān)覀冎溃?/p>

  • 弱引用對(duì)象通過(guò) wr_object 字段關(guān)聯(lián)被引用的對(duì)象,如上圖虛線箭頭所示;
  • 一個(gè)對(duì)象可以同時(shí)被多個(gè)弱引用對(duì)象關(guān)聯(lián),圖中的 Data 實(shí)例對(duì)象被兩個(gè)弱引用對(duì)象關(guān)聯(lián);
  • 所有關(guān)聯(lián)同一個(gè)對(duì)象的弱引用,被組織成一個(gè)雙向鏈表,鏈表頭保存在被引用對(duì)象中,如上圖實(shí)線箭頭所示;
  • 當(dāng)一個(gè)對(duì)象被銷(xiāo)毀后,Python 將遍歷它的弱引用鏈表,逐一處理:

將 wr_object 字段設(shè)為 None ,弱引用對(duì)象再被調(diào)用將返回 None ,調(diào)用者便知道對(duì)象已經(jīng)被銷(xiāo)毀了;

執(zhí)行回調(diào)函數(shù) wr_callback (如有);

由此可見(jiàn),弱引用的工作原理其實(shí)就是設(shè)計(jì)模式中的 觀察者模式( Observer )。當(dāng)對(duì)象被銷(xiāo)毀,它的所有弱引用對(duì)象都得到通知,并被妥善處理。

實(shí)現(xiàn)細(xì)節(jié)

掌握弱引用的基本原理,足以讓我們將其用好。如果您對(duì)源碼感興趣,還可以再深入研究它的一些實(shí)現(xiàn)細(xì)節(jié)。

前面我們提到,對(duì)同一對(duì)象的所有弱引用,被組織成一個(gè)雙向鏈表,鏈表頭保存在對(duì)象中。由于能夠創(chuàng)建弱引用的對(duì)象類(lèi)型是多種多樣的,很難由一個(gè)固定的結(jié)構(gòu)體來(lái)表示。因此,Python 在類(lèi)型對(duì)象中提供一個(gè)字段 tp_weaklistoffset ,記錄弱引用鏈表頭指針在實(shí)例對(duì)象中的偏移量。

由此一來(lái),對(duì)于任意對(duì)象 o ,我們只需通過(guò) ob_type 字段找到它的類(lèi)型對(duì)象 t ,再根據(jù) t 中的 tp_weaklistoffset 字段即可找到對(duì)象 o 的弱引用鏈表頭。

Python 在 Include/objimpl.h 頭文件中提供了兩個(gè)宏定義:

  1. /* Test if a type supports weak references */ 
  2. #define PyType_SUPPORTS_WEAKREFS(t) ((t)->tp_weaklistoffset > 0) 
  3.  
  4. #define PyObject_GET_WEAKREFS_LISTPTR(o) \ 
  5.     ((PyObject **) (((char *) (o)) + Py_TYPE(o)->tp_weaklistoffset)) 
  • PyType_SUPPORTS_WEAKREFS 用于判斷類(lèi)型對(duì)象是否支持弱引用,僅當(dāng) tp_weaklistoffset 大于零才支持弱引用,內(nèi)置對(duì)象 list 等都不支持弱引用;
  • PyObject_GET_WEAKREFS_LISTPTR 用于取出一個(gè)對(duì)象的弱引用鏈表頭,它先通過(guò) Py_TYPE 宏找到類(lèi)型對(duì)象 t ,再找通過(guò) tp_weaklistoffset 字段確定偏移量,最后與對(duì)象地址相加即可得到鏈表頭字段的地址;

我們創(chuàng)建弱引用時(shí),需要調(diào)用弱引用類(lèi)型對(duì)象 weakref 并將被引用對(duì)象 d 作為參數(shù)傳進(jìn)去。弱引用類(lèi)型對(duì)象 weakref 是所有弱引用實(shí)例對(duì)象的類(lèi)型,是一個(gè)全局唯一的類(lèi)型對(duì)象,定義在 Objects/weakrefobject.c 中,即:_PyWeakref_RefType(第 350 行)。

根據(jù)對(duì)象模型中學(xué)到的知識(shí),Python 調(diào)用一個(gè)對(duì)象時(shí),執(zhí)行的是其類(lèi)型對(duì)象中的 tp_call 函數(shù)。因此,調(diào)用弱引用類(lèi)型對(duì)象 weakref 時(shí),執(zhí)行的是 weakref 的類(lèi)型對(duì)象,也就是 type 的 tp_call 函數(shù)。tp_call 函數(shù)則回過(guò)頭來(lái)調(diào)用 weakref 的 tp_new 和 tp_init 函數(shù),其中 tp_new 為實(shí)例對(duì)象分配內(nèi)存,而 tp_init 則負(fù)責(zé)初始化實(shí)例對(duì)象。

回到 Objects/weakrefobject.c 源文件,可以看到 _PyWeakref_RefType 的 tp_new 字段被初始化成 weakref___new__ (第 276 行)。該函數(shù)的主要處理邏輯如下:

  1. 解析參數(shù),得到被引用的對(duì)象(第 282 行);
  2. 調(diào)用 PyType_SUPPORTS_WEAKREFS 宏判斷被引用的對(duì)象是否支持弱引用,不支持就拋異常(第 286 行);
  3. 調(diào)用 GET_WEAKREFS_LISTPTR 行取出對(duì)象的弱引用鏈表頭字段,為方便插入返回的是一個(gè)二級(jí)指針(第 294 行);
  4. 調(diào)用 get_basic_refs 取出鏈表最前那個(gè) callback 為空 基礎(chǔ)弱引用對(duì)象(如有,第 295 行);
  5. 如果 callback 為空,而且對(duì)象存在 callback 為空的基礎(chǔ)弱引用,則復(fù)用該實(shí)例直接將其返回(第 296 行);
  6. 如果不能復(fù)用,調(diào)用 tp_alloc 函數(shù)分配內(nèi)存、完成字段初始化,并插到對(duì)象的弱引用鏈表(第 309 行);
  • 如果 callback 為空,直接將其插入到鏈表最前面,方便后續(xù)復(fù)用(見(jiàn)第 4 點(diǎn));
  • 如果 callback 非空,將其插到基礎(chǔ)弱引用對(duì)象(如有)之后,保證基礎(chǔ)弱引用位于鏈表頭,方便獲取;

當(dāng)一個(gè)對(duì)象被回收后,tp_dealloc 函數(shù)將調(diào)用 PyObject_ClearWeakRefs 函數(shù)對(duì)它的弱引用進(jìn)行清理。該函數(shù)取出對(duì)象的弱引用鏈表,然后逐個(gè)遍歷,清理 wr_object 字段并執(zhí)行 wr_callback 回調(diào)函數(shù)(如有)。具體細(xì)節(jié)不再展開(kāi),有興趣的話可以自行查閱 Objects/weakrefobject.c 中的源碼,位于 880 行。

好了,經(jīng)過(guò)本節(jié)學(xué)習(xí),我們徹底掌握了弱引用相關(guān)知識(shí)。弱引用可以在不產(chǎn)生引用計(jì)數(shù)的前提下,對(duì)目標(biāo)對(duì)象進(jìn)行管理,常用于框架和中間件中。弱引用看起來(lái)很神奇,其實(shí)設(shè)計(jì)原理是非常簡(jiǎn)單的觀察者模式。弱引用對(duì)象創(chuàng)建后便插到一個(gè)由目標(biāo)對(duì)象維護(hù)的鏈表中,觀察(訂閱)對(duì)象的銷(xiāo)毀事件。

 

責(zé)任編輯:武曉燕 來(lái)源: 小菜學(xué)編程
相關(guān)推薦

2021-12-09 15:45:09

Python弱引用代碼

2024-10-09 08:54:31

2020-04-03 11:24:50

LinuxUnix進(jìn)程

2023-01-31 09:02:24

JSVMVR

2022-06-01 07:10:43

遞歸字典極限

2013-08-19 17:14:04

.Net強(qiáng)引用弱引用

2010-11-23 10:21:53

跳槽

2022-06-29 08:32:04

游標(biāo)MySQL服務(wù)器

2019-06-03 10:14:07

API網(wǎng)關(guān)微服務(wù)

2024-03-08 13:33:08

PG數(shù)據(jù)安全

2018-01-10 08:27:00

2020-12-02 09:01:40

Java基礎(chǔ)

2022-10-24 09:57:02

runeGo語(yǔ)言

2022-09-22 14:55:31

前端JavaScripthis

2022-09-26 13:10:17

JavaScriptthis

2023-12-12 08:41:01

2021-11-25 07:42:11

命令Linux系統(tǒng)

2016-11-23 08:36:38

Windows 10登錄PIN碼快

2011-08-23 13:50:17

程序員

2015-11-02 17:20:00

Java弱引用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩av电影中文字幕| 亚洲免费视频网站| 欧美一级中文字幕| 婷婷五月综合激情| 男男视频亚洲欧美| 久久91亚洲人成电影网站| av无码一区二区三区| av免费在线一区| 亚洲精品自拍动漫在线| 久久资源亚洲| 999av视频| 免费日韩av片| 久久中文字幕在线| 亚洲自拍偷拍一区二区| 国产一区二区三区亚洲综合| 亚洲国产一区视频| 一本一生久久a久久精品综合蜜| 亚洲欧美黄色片| 美女免费视频一区二区| 国内偷自视频区视频综合| 妖精视频在线观看免费| 久久aimee| 欧美一区二区三区视频| 成人中文字幕av| 97久久人人超碰caoprom| 国产精品每日更新| 欧美二区在线| 狠狠躁日日躁夜夜躁av| 国产suv精品一区| 欧美午夜精品久久久久久人妖| 国产日韩第一页| 国产日韩精品在线看| 国产91精品久久久久久久网曝门| 国产精品久久久久久影视| 国产视频91在线| 国内精品久久久久久久影视蜜臀| 中文字幕日韩欧美在线| 偷拍女澡堂一区二区三区| 99亚洲乱人伦aⅴ精品| 欧美日韩一级二级| 欧美 国产 小说 另类| 国产盗摄精品一区二区酒店| 自拍偷拍亚洲欧美日韩| 亚洲精品国产精品国自产| 天堂av在线播放| www.色精品| 国产精品初高中精品久久| 在线观看视频中文字幕| 日本麻豆一区二区三区视频| 日本成人免费在线| www.com亚洲| 男人的天堂成人在线| 午夜精品一区二区三区在线| 国产真实夫妇交换视频| 国产在线日韩| 久久久欧美精品| 日本五十路女优| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美疯狂做受xxxx高潮| 久久久久久久久久一区二区三区| 欧美激情成人在线| 久久久久久久色| 全部毛片永久免费看| 99热这里只有精品8| 91国内免费在线视频| 亚洲伊人成人网| 日韩不卡一二三区| 国产美女久久精品香蕉69| 国产精品呻吟久久| 国产成人午夜高潮毛片| 国产乱码精品一区二区三区不卡| 日本激情一区二区| 久久精品一区二区三区不卡| 午夜精品福利一区二区| 免费高清在线观看| 亚洲自拍偷拍网站| 激情深爱综合网| 亚洲伦乱视频| 91精品国产欧美日韩| 精品国产一二区| 日韩精品免费一区二区夜夜嗨| 亚洲欧美在线免费观看| 精品女人久久久| 国产一区视频在线观看免费| 奇米四色中文综合久久| 国产一级片一区二区| 国产一区二区看久久| 99精品欧美一区二区三区| 无码精品人妻一区二区| 中文字幕巨乱亚洲| www.在线观看av| 新片速递亚洲合集欧美合集| 91精品久久久久久久久99蜜臂| 香蕉视频污视频| 成人精品中文字幕| 久久不射电影网| 久久夜色精品国产噜噜亚洲av| 久久av老司机精品网站导航| 国产欧美日韩伦理| 成人高潮成人免费观看| 一区二区三区在线观看欧美| 日日碰狠狠丁香久燥| 日韩综合一区二区三区| 亚洲少妇激情视频| 欧洲猛交xxxx乱大交3| 老鸭窝毛片一区二区三区| 96成人在线视频| 国产高清在线看| 亚洲一区二区三区在线| 亚洲老女人av| 黑人久久a级毛片免费观看| 中文字幕一精品亚洲无线一区| 国产亚洲欧美久久久久| 蜜臀va亚洲va欧美va天堂| 精品视频免费观看| v片在线观看| 欧美色成人综合| 蜜桃精品成人影片| 欧美精品一卡| 国产精品视频午夜| 同心难改在线观看| 亚洲一区国产视频| 亚洲精品永久视频| 免费视频一区三区| 久久久久久91香蕉国产| 国产裸体无遮挡| 欧美激情一区二区三区在线| 欧洲黄色一级视频| 国产成人福利av| 欧美成人中文字幕| 国产精品高潮呻吟av| 国产欧美精品国产国产专区| 亚洲自偷自拍熟女另类| www.神马久久| 欧美肥婆姓交大片| 国产福利视频导航| 亚洲人成在线播放网站岛国| 日韩中文字幕三区| 久久香蕉网站| 久久久在线观看| 成人免费观看在线视频| 一区二区三区久久久| 亚洲综合123| 91精品精品| 成人网在线免费观看| 在线日本中文字幕| 欧美撒尿777hd撒尿| 性高潮久久久久久久 | 香蕉久久夜色| 欧美一级大片| 亚洲亚裔videos黑人hd| 无码人妻精品一区二区| 国产丝袜在线精品| 波多野结衣天堂| 日韩av免费大片| 国产精品视频在线播放| 男人资源在线播放| 欧美一区二区三区喷汁尤物| www.99re7| 成人毛片视频在线观看| 欧美成人免费在线观看视频| 欧美人妖在线观看| 欧美最猛性xxxx| 国产福利第一视频在线播放| 欧美日韩成人综合| 成年人一级黄色片| 粉嫩av一区二区三区粉嫩 | 午夜av在线播放| 精品成人a区在线观看| 国产精品美女毛片真酒店| 91亚洲精品一区二区乱码| 欧美日韩激情视频在线观看| 国产一区二区三区电影在线观看| 国产精品夫妻激情| 黄色视屏免费在线观看| 精品免费日韩av| 中文字幕日韩一级| 欧美激情一区二区三区蜜桃视频 | 久久女人天堂| 欧美华人在线视频| 免费黄色在线视频网站| 欧美日韩不卡一区| 精品无码人妻一区二区三区| 91视频在线看| 自拍偷拍一区二区三区四区| 欧美久久影院| 日本高清久久一区二区三区| 97久久精品一区二区三区的观看方式| 欧美第一黄色网| 激情在线视频| 日韩一区二区三区视频| 国产精品一区二区三区四| 中文字幕亚洲成人| av漫画在线观看| 日韩经典一区二区| 国产成人亚洲综合无码| 久久综合色占| av一区二区在线看| 成人免费网站www网站高清| 久久成年人视频| 蜜桃视频在线播放| 日韩欧美电影在线| 波多野结衣二区三区| 一区二区免费看| 国产精品xxxx| 日本精品久久久久| 欧美三级中文字幕| 日韩大片免费在线观看| 国产精品久久久久久久久免费桃花 | 麻豆国产在线播放| 精品久久人人做人人爽| 亚洲天堂中文网| 欧美性猛交xxxx乱大交| 一区二区在线观看免费视频| 国产蜜臀av在线一区二区三区| 少妇献身老头系列| 久久99国产精品免费| 国产成人综合一区| 在线综合亚洲| 国产精品免费看久久久无码| 91亚洲国产成人久久精品| 欧美精品v日韩精品v国产精品| 一区二区三区自拍视频| 国产啪精品视频网站| 成人黄色免费短视频| 97碰在线观看| 成人av影院在线观看| 久久夜精品香蕉| 在线看黄色av| 在线不卡国产精品| 撸视在线观看免费视频| 日韩av影视在线| 免费av一级片| 亚洲精品在线一区二区| www.com在线观看| 91麻豆精品国产无毒不卡在线观看| 国产精品尤物视频| 欧美性极品xxxx娇小| 黄网在线观看视频| 欧美日韩国内自拍| 1级黄色大片儿| 亚洲成av人片在线观看无码| 国产精彩视频在线| 亚洲国产欧美一区二区三区丁香婷| 免费中文字幕在线| 亚洲激情男女视频| 精品无码人妻一区二区三区 | 久久久久亚洲av成人毛片韩| 欧美日韩国产激情| 香蕉免费毛片视频| 天天免费综合色| 国产精品人人人人| 色999日韩国产欧美一区二区| 国产成人精品777777| 色av一区二区| 亚洲天堂中文网| 欧美一级日韩一级| www.欧美国产| 亚洲精品91美女久久久久久久| 色欲av伊人久久大香线蕉影院| 亚洲第五色综合网| 日韩一区av| 在线不卡国产精品| h视频在线免费观看| 欧美夫妻性生活xx| 操人在线观看| 日本人成精品视频在线| 国产精品高潮久久| 91嫩草免费看| 欧美a一欧美| 欧美在线视频二区| 999国产精品视频| 免费网站在线观看视频| 日韩视频免费| 国产免费又粗又猛又爽| 国产精品自拍毛片| 国产精品无码电影| 国产精品青草久久| 69av.com| 精品日本美女福利在线观看| 自拍偷拍18p| 7777精品伊人久久久大香线蕉的| 亚洲精品成av人片天堂无码| 亚洲跨种族黑人xxx| 在线观看美女网站大全免费| 欧美激情视频免费观看| 欧洲av不卡| 97人人澡人人爽| 久久av网址| 九九久久九九久久| 久久人人97超碰国产公开结果| 五月六月丁香婷婷| 久久综合九色欧美综合狠狠| 黄色录像一级片| 婷婷六月综合亚洲| 国产亲伦免费视频播放| 国产丝袜高跟一区| 国产精品刘玥久久一区| 日本精品一区二区三区在线| 视频成人永久免费视频| 欧美一级爽aaaaa大片| 国产一在线精品一区在线观看| 黄色aaa级片| av亚洲精华国产精华精华| 国产麻豆a毛片| 欧美性猛交xxxx乱大交蜜桃| 国产免费一区二区三区最新不卡 | 欧洲中文字幕精品| 黑人精品一区二区| 久久精品亚洲精品| 欧洲亚洲两性| 国产精品午夜av在线| 婷婷丁香综合| 亚洲五月天综合| 99这里只有精品| 美国黄色小视频| 欧美日韩国产首页在线观看| 你懂的视频在线免费| 久久久免费av| 亚洲国产中文在线二区三区免| 色一情一乱一伦一区二区三区丨 | 亚洲欧美日韩一级| 久久综合五月天婷婷伊人| 久久久久99精品成人片毛片| 在线电影国产精品| lutube成人福利在线观看| 奇米成人av国产一区二区三区| 超碰地址久久| www.男人天堂网| 国产激情偷乱视频一区二区三区| 国产又粗又长又硬| 欧美亚洲一区二区在线观看| 毛片免费在线观看| 国产成人综合精品| 自拍视频一区| 久久久精品在线视频| 91亚洲男人天堂| 亚洲久久在线观看| 国产视频精品久久久| 91精品论坛| 欧美日韩综合另类| 久久久久国产精品午夜一区| av无码av天天av天天爽| 精品成人乱色一区二区| 天堂在线中文网| 9.1国产丝袜在线观看| 欧美日韩一本| 欧美日韩在线一| 久久综合久久久久88| 精品国产xxx| 国产香蕉一区二区三区在线视频| 欧美日韩五码| 一本—道久久a久久精品蜜桃| 极品少妇xxxx精品少妇| 国产一区二区播放| 日韩精品中午字幕| av在线视屏| 蜜桃传媒视频麻豆一区| 久久国产主播| 天堂资源在线视频| 这里只有精品视频在线观看| 性网站在线观看| 精品国产免费久久久久久尖叫| 麻豆精品网站| 日本污视频网站| 91精品国产高清一区二区三区| 国产最新在线| 国产精品一区二区三区四区五区| 国产欧美精品久久| 少妇的滋味中文字幕bd| 欧美一级欧美三级| 国产拍在线视频| 日产精品一线二线三线芒果| 久久精品国产99国产| 国产探花在线播放| 日韩成人xxxx| 久久亚洲精品中文字幕| 99热久久这里只有精品| 久久影音资源网| 国产精品久久久久久免费播放| 欧美极品xxxx| 激情综合网站| 色哟哟在线观看视频| 欧美日韩激情网| 日本中文字幕在线视频| 国产精品一级久久久| 日本怡春院一区二区| 久久久久久久久久91| 国产一区二区三区直播精品电影| 久久精品一级| 无码人妻丰满熟妇区五十路百度| 综合分类小说区另类春色亚洲小说欧美 | 久久精品欧洲| 欧美精品色哟哟| 影音先锋日韩有码| 国产图片一区| 在线播放av中文字幕| 欧美特级www| 日韩伦理电影网站| 少妇特黄a一区二区三区|