久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python之路-进程

發(fā)布時(shí)間:2023/12/31 python 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python之路-进程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

理論知識(shí)

操作系統(tǒng)背景知識(shí)

顧名思義,進(jìn)程即程序正在執(zhí)行的一個(gè)過(guò)程,進(jìn)程是對(duì)正在運(yùn)行的程序的一個(gè)抽象.

進(jìn)程的概念起源于操作系統(tǒng),是操作系統(tǒng)最核心的概念,也是操作系統(tǒng)提供的最古老也是最總要的抽象概念之一.操作系統(tǒng)的其他所有內(nèi)容都是圍繞進(jìn)程概念展開(kāi)的.

所以想要真正了解進(jìn)程,必須事先了解操作系統(tǒng)

PS:即使可以利用cpu只有一個(gè)(早期的計(jì)算機(jī)確實(shí)如此),也能保證支持(偽)并發(fā)的能力,將一個(gè)單獨(dú)的cpu變成多個(gè)虛擬的cup(多道技術(shù):時(shí)間多路復(fù)用和空間多路復(fù)用+硬件上支持隔離),沒(méi)有進(jìn)程的抽象,現(xiàn)代計(jì)算機(jī)將不復(fù)存在.

必備的理論基礎(chǔ):

一 操作系統(tǒng)的作用:

  1:隱藏丑陋復(fù)雜的硬件接口,提供良好的抽象接口

  2:管理,調(diào)度進(jìn)程,并且將多個(gè)進(jìn)程對(duì)硬件的競(jìng)爭(zhēng)變的有序

二 多道技術(shù):

  1.產(chǎn)生背景:針對(duì)單核,實(shí)現(xiàn)開(kāi)發(fā)

  ps:

  現(xiàn)在的主機(jī)一般是多核,那么每個(gè)核都會(huì)利用多道技術(shù)

  有4個(gè)cpu,運(yùn)行于cpu1的某個(gè)程序遇到io阻塞,會(huì)等到io結(jié)束再重新調(diào)度,會(huì)被調(diào)度到4個(gè)cpu中的任意一個(gè),具體由操作系統(tǒng)調(diào)度算法決定.

  2.空間上的復(fù)用:如內(nèi)存中同時(shí)有多道程序

  3.時(shí)間上的復(fù)用:復(fù)用一個(gè)cpu的時(shí)間片

    強(qiáng)調(diào):遇到io切,占用cpu時(shí)間過(guò)長(zhǎng)也切,核心在于切之前將進(jìn)程的狀態(tài)保存下來(lái),這樣才能保證下次切換回來(lái)時(shí),能基于上次切走的位置繼續(xù)運(yùn)行

什么是進(jìn)程

進(jìn)程(Process)是計(jì)算機(jī)中程序關(guān)于某數(shù)據(jù)集合上的一次運(yùn)行活動(dòng),是系統(tǒng)進(jìn)行資源分配好調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ).在早期面向進(jìn)程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中,進(jìn)程是程序 基本執(zhí)行實(shí)體;在當(dāng)代面向線程設(shè)計(jì)的計(jì)算機(jī)結(jié)構(gòu)中,進(jìn)程是線程的容器,線程是程序的基本執(zhí)行實(shí)體.程序是指令,數(shù)據(jù)以及其組織形式的描述,進(jìn)程是程序的實(shí)體.

狹義的定義:進(jìn)程是正在運(yùn)行的程序的實(shí)例(an instance of a computer program that exected)

廣義定義:進(jìn)程是一個(gè)具有一定獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它是操作系統(tǒng)動(dòng)態(tài)執(zhí)行的基本單元,在傳統(tǒng)的操作系統(tǒng)中,進(jìn)程既是基本的分配單元,也是基本的執(zhí)行單元。

進(jìn)程的概念

第一,進(jìn)程是一個(gè)實(shí)體。每一個(gè)進(jìn)程都有它自己的地址空間,一般情況下,包括文本區(qū)域(text region)、數(shù)據(jù)區(qū)域(data region)和堆棧(stack region)。文本區(qū)域存儲(chǔ)處理器執(zhí)行的代碼;數(shù)據(jù)區(qū)域存儲(chǔ)變量和進(jìn)程執(zhí)行期間使用的動(dòng)態(tài)分配的內(nèi)存;堆棧區(qū)域存儲(chǔ)著活動(dòng)過(guò)程調(diào)用的指令和本地變量。
第二,進(jìn)程是一個(gè)“執(zhí)行中的程序”。程序是一個(gè)沒(méi)有生命的實(shí)體,只有處理器賦予程序生命時(shí)(操作系統(tǒng)執(zhí)行之),它才能成為一個(gè)活動(dòng)的實(shí)體,我們稱(chēng)其為進(jìn)程。[3]
進(jìn)程是操作系統(tǒng)中最基本、重要的概念。是多道程序系統(tǒng)出現(xiàn)后,為了刻畫(huà)系統(tǒng)內(nèi)部出現(xiàn)的動(dòng)態(tài)情況,描述系統(tǒng)內(nèi)部各道程序的活動(dòng)規(guī)律引進(jìn)的一個(gè)概念,所有多道程序設(shè)計(jì)操作系統(tǒng)都建立在進(jìn)程的基礎(chǔ)上。

操作系統(tǒng)引入進(jìn)程的概念的原因

從理論角度看,是對(duì)正在運(yùn)行的程序過(guò)程的抽象;

從實(shí)現(xiàn)角度看,是一種數(shù)據(jù)結(jié)構(gòu),目的在于清晰地刻畫(huà)動(dòng)態(tài)系統(tǒng)的內(nèi)在規(guī)律,有效管理和調(diào)度進(jìn)入計(jì)算機(jī)系統(tǒng)主存儲(chǔ)器運(yùn)行的程序.

進(jìn)程的特征

動(dòng)態(tài)性:進(jìn)程的實(shí)質(zhì)是程序 在多道程序系統(tǒng)中的一次執(zhí)行過(guò)程,進(jìn)程是動(dòng)態(tài)產(chǎn)生,動(dòng)態(tài)消亡的.

并發(fā)性:任何進(jìn)程都可以同其他進(jìn)程一起并發(fā)執(zhí)行

獨(dú)立性:進(jìn)程是一個(gè)獨(dú)立運(yùn)行的基本單位,同時(shí)也是系統(tǒng)分配資源和調(diào)度的獨(dú)立單位;

異步性:由于進(jìn)程間的相互制約,使進(jìn)程具有執(zhí)行的間斷性,即進(jìn)程按各自獨(dú)立的,不可預(yù)知的速度向前推進(jìn)

結(jié)構(gòu)特征:進(jìn)程由程序,數(shù)據(jù)和進(jìn)程控制塊三部分組成.

多個(gè)不同的進(jìn)程可以包含相同的程序:一個(gè)程序在不同的數(shù)據(jù)集里就構(gòu)成不同的進(jìn)程,嫩得到不同的結(jié)果;但是執(zhí)行過(guò)程中,程序不能發(fā)生改變.

進(jìn)程與程序中的區(qū)別

程序是指令和數(shù)據(jù)的有序集合,其本身沒(méi)有任何運(yùn)行的含義,是一個(gè)靜態(tài)的概念.

而進(jìn)程是程序在處理機(jī)上的一次執(zhí)行過(guò)程,它是一個(gè)動(dòng)態(tài)的概念.

程序可以作為一種軟件資料長(zhǎng)期存在,而進(jìn)程是有一定生命期的.

程序是永久的,進(jìn)程是暫時(shí)的.

注意:同一個(gè)程序執(zhí)行兩次,就會(huì)在操作系統(tǒng)中出現(xiàn)兩個(gè)進(jìn)程,所以我們可以同時(shí)運(yùn)行一個(gè)軟件,分別做不同的事情也不會(huì)混亂.

進(jìn)程調(diào)度

想要多個(gè)進(jìn)程交替運(yùn)行,操作系統(tǒng)必須對(duì)這些進(jìn)程進(jìn)行調(diào)度,這個(gè)調(diào)度也不是隨機(jī)進(jìn)行的,而是需要遵循一定的原則,由此就有了進(jìn)程的調(diào)度算法.

先來(lái)先服務(wù)調(diào)度算法:

先來(lái)先服務(wù)(FCFS)調(diào)度算法是一種最簡(jiǎn)單的調(diào)度算法,該算法即可以用于作業(yè)調(diào)度,也可用于進(jìn)程調(diào)度,FCFS算法比較有利于長(zhǎng)作業(yè)(進(jìn)程),而不利于短作業(yè)(進(jìn)程).由此可知,本算法適合于CPU繁忙型作業(yè),而不利于I/O繁忙型的作業(yè)(進(jìn)程)

短作業(yè)優(yōu)先調(diào)度算法

短作業(yè)(進(jìn)程)優(yōu)先調(diào)度算法(SJ/PF)是指對(duì)短作業(yè)或者短進(jìn)程優(yōu)先調(diào)度的算法,該算法即可用于作業(yè)調(diào)度,也可用于進(jìn)程調(diào)度,但其對(duì)長(zhǎng)作業(yè)不利;不能保證緊迫性作業(yè)(進(jìn)程)被及時(shí)處理;作業(yè)長(zhǎng)短只是被估算出來(lái)的.

時(shí)間片輪轉(zhuǎn)法

時(shí)間片輪轉(zhuǎn)(Round Robin,RR)法的基本思路是讓每個(gè)進(jìn)程在就緒隊(duì)列中的等待時(shí)間與享受服務(wù)的時(shí)間成比例。在時(shí)間片輪轉(zhuǎn)法中,需要將CPU的處理時(shí)間分成固定大小的時(shí)間片,例如,幾十毫秒至幾百毫秒。如果一個(gè)進(jìn)程在被調(diào)度選中之后用完了系統(tǒng)規(guī)定的時(shí)間片,但又未完成要求的任務(wù),則它自行釋放自己所占有的CPU而排到就緒隊(duì)列的末尾,等待下一次調(diào)度。同時(shí),進(jìn)程調(diào)度程序又去調(diào)度當(dāng)前就緒隊(duì)列中的第一個(gè)進(jìn)程。
顯然,輪轉(zhuǎn)法只能用來(lái)調(diào)度分配一些可以搶占的資源。這些可以搶占的資源可以隨時(shí)被剝奪,而且可以將它們?cè)俜峙浣o別的進(jìn)程。CPU是可搶占資源的一種。但打印機(jī)等資源是不可搶占的。由于作業(yè)調(diào)度是對(duì)除了CPU之外的所有系統(tǒng)硬件資源的分配,其中包含有不可搶占資源,所以作業(yè)調(diào)度不使用輪轉(zhuǎn)法。
在輪轉(zhuǎn)法中,時(shí)間片長(zhǎng)度的選取非常重要。首先,時(shí)間片長(zhǎng)度的選擇會(huì)直接影響到系統(tǒng)的開(kāi)銷(xiāo)和響應(yīng)時(shí)間。如果時(shí)間片長(zhǎng)度過(guò)短,則調(diào)度程序搶占處理機(jī)的次數(shù)增多。這將使進(jìn)程上下文切換次數(shù)也大大增加,從而加重系統(tǒng)開(kāi)銷(xiāo)。反過(guò)來(lái),如果時(shí)間片長(zhǎng)度選擇過(guò)長(zhǎng),例如,一個(gè)時(shí)間片能保證就緒隊(duì)列中所需執(zhí)行時(shí)間最長(zhǎng)的進(jìn)程能執(zhí)行完畢,則輪轉(zhuǎn)法變成了先來(lái)先服務(wù)法。時(shí)間片長(zhǎng)度的選擇是根據(jù)系統(tǒng)對(duì)響應(yīng)時(shí)間的要求和就緒隊(duì)列中所允許最大的進(jìn)程數(shù)來(lái)確定的。
在輪轉(zhuǎn)法中,加入到就緒隊(duì)列的進(jìn)程有3種情況:
一種是分給它的時(shí)間片用完,但進(jìn)程還未完成,回到就緒隊(duì)列的末尾等待下次調(diào)度去繼續(xù)執(zhí)行。
另一種情況是分給該進(jìn)程的時(shí)間片并未用完,只是因?yàn)檎?qǐng)求I/O或由于進(jìn)程的互斥與同步關(guān)系而被阻塞。當(dāng)阻塞解除之后再回到就緒隊(duì)列。
第三種情況就是新創(chuàng)建進(jìn)程進(jìn)入就緒隊(duì)列。
如果對(duì)這些進(jìn)程區(qū)別對(duì)待,給予不同的優(yōu)先級(jí)和時(shí)間片從直觀上看,可以進(jìn)一步改善系統(tǒng)服務(wù)質(zhì)量和效率。例如,我們可把就緒隊(duì)列按照進(jìn)程到達(dá)就緒隊(duì)列的類(lèi)型和進(jìn)程被阻塞時(shí)的阻塞原因分成不同的就緒隊(duì)列,每個(gè)隊(duì)列按FCFS原則排列,各隊(duì)列之間的進(jìn)程享有不同的優(yōu)先級(jí),但同一隊(duì)列內(nèi)優(yōu)先級(jí)相同。這樣,當(dāng)一個(gè)進(jìn)程在執(zhí)行完它的時(shí)間片之后,或從睡眠中被喚醒以及被創(chuàng)建之后,將進(jìn)入不同的就緒隊(duì)列。

多級(jí)反饋隊(duì)列

前面介紹的各種用作進(jìn)程調(diào)度的算法都有一定的局限性,如短進(jìn)程優(yōu)先的調(diào)度算法,僅照顧了短進(jìn)程而忽略了長(zhǎng)進(jìn)程,而且如果并未指明進(jìn)程的長(zhǎng)度,則短進(jìn)程優(yōu)先和基于進(jìn)程長(zhǎng)度的搶占式調(diào)度算法都將無(wú)法使用.

而多級(jí)反饋隊(duì)列調(diào)度算法則不必事先知道各種進(jìn)程所需的執(zhí)行時(shí)間,而且還可以滿足各種類(lèi)型進(jìn)程的需要,因而它是目前被公認(rèn)的一種較好的進(jìn)程調(diào)度算法,在采用多級(jí)反饋隊(duì)列調(diào)度算法的系統(tǒng)中,掉度算法的實(shí)施過(guò)程如下所述.

(1)應(yīng)設(shè)置多個(gè)就緒隊(duì)列,并為各個(gè)隊(duì)列賦予不同的優(yōu)先級(jí),第一個(gè)隊(duì)列的優(yōu)先級(jí)最高,第二個(gè)隊(duì)列次之,其余各隊(duì)列的優(yōu)先權(quán)逐個(gè)降低.該算法賦予各個(gè)隊(duì)列中進(jìn)程執(zhí)行時(shí)間片的大小也各不相同,在優(yōu)先權(quán)愈高的隊(duì)列中,為每個(gè)進(jìn)程所規(guī)定的執(zhí)行時(shí)間片愈小.例如,第二個(gè)隊(duì)列的時(shí)間片要比第一個(gè)隊(duì)列的時(shí)間片長(zhǎng)一杯,......,第i+1個(gè)隊(duì)列的時(shí)間片要比第i個(gè)列隊(duì)的時(shí)間片長(zhǎng)一倍.

(2) 當(dāng)一個(gè)新進(jìn)程進(jìn)入內(nèi)存后,首先將它放入第一隊(duì)列的末尾,按FCFS原則排隊(duì)等待調(diào)度。當(dāng)輪到該進(jìn)程執(zhí)行時(shí),如它能在該時(shí)間片內(nèi)完成,便可準(zhǔn)備撤離系統(tǒng);如果它在一個(gè)時(shí)間片結(jié)束時(shí)尚未完成,調(diào)度程序便將該進(jìn)程轉(zhuǎn)入第二隊(duì)列的末尾,再同樣地按FCFS原則等待調(diào)度執(zhí)行;如果它在第二隊(duì)列中運(yùn)行一個(gè)時(shí)間片后仍未完成,再依次將它放入第三隊(duì)列,……,如此下去,當(dāng)一個(gè)長(zhǎng)作業(yè)(進(jìn)程)從第一隊(duì)列依次降到第n隊(duì)列后,在第n 隊(duì)列便采取按時(shí)間片輪轉(zhuǎn)的方式運(yùn)行。

(3) 僅當(dāng)?shù)谝魂?duì)列空閑時(shí),調(diào)度程序才調(diào)度第二隊(duì)列中的進(jìn)程運(yùn)行;僅當(dāng)?shù)?~(i-1)隊(duì)列均空時(shí),才會(huì)調(diào)度第i隊(duì)列中的進(jìn)程運(yùn)行。如果處理機(jī)正在第i隊(duì)列中為某進(jìn)程服務(wù)時(shí),又有新進(jìn)程進(jìn)入優(yōu)先權(quán)較高的隊(duì)列(第1~(i-1)中的任何一個(gè)隊(duì)列),則此時(shí)新進(jìn)程將搶占正在運(yùn)行進(jìn)程的處理機(jī),即由調(diào)度程序把正在運(yùn)行的進(jìn)程放回到第i隊(duì)列的末尾,把處理機(jī)分配給新到的高優(yōu)先權(quán)進(jìn)程

進(jìn)程的并行與并發(fā)

并行:并行是指兩者同時(shí)執(zhí)行,比如有兩條車(chē)道,在某一個(gè)時(shí)間點(diǎn),兩條車(chē)道上都有車(chē)在跑;(資源夠用,比如三個(gè)線程,四核的cpu)

并發(fā):并發(fā)是指資源有限的情況下,兩者交替輪流使用資源,比如只有一條車(chē)道(單核cpu資源),那么就是A車(chē)先走,在某個(gè)時(shí)刻A車(chē)退出把道路讓給B走,B走完了繼續(xù)給A,交替使用,目的是提高效率.

區(qū)別:

并行是從微觀上,也就是一個(gè)精確的時(shí)間片刻,有不同的程序在執(zhí)行,這就要求必須有多個(gè)處理器.

并發(fā)是從宏觀上,在一個(gè)時(shí)間段上可以看出是同時(shí)執(zhí)行的,比如一個(gè)服務(wù)器同時(shí)處理多個(gè)session.

注意:早期單核cpu時(shí)候,對(duì)于進(jìn)程也是微觀上串行,(站在cpu角度看),宏觀上并行(站在人的角度看就是同時(shí)有很多程序在執(zhí)行).

同步異步阻塞非阻塞

狀態(tài)介紹

  在了解其他概念之前,我們首先了解進(jìn)程的幾個(gè)狀態(tài),在程序運(yùn)行的過(guò)程中,由于被操作系統(tǒng)的調(diào)度算法控制,程序會(huì)進(jìn)入幾個(gè)狀態(tài):就緒,運(yùn)行,阻塞.

(1)就緒(Ready)狀態(tài)

  在進(jìn)程已經(jīng)分配到除cpu以外的所有必要的資源,只要獲得處理機(jī)便立即執(zhí)行,這時(shí)的進(jìn)程狀態(tài)稱(chēng)為就緒狀態(tài).

(2)執(zhí)行/運(yùn)行(Running)狀態(tài)當(dāng)進(jìn)程已獲得處理機(jī),其程序正在處理機(jī)上執(zhí)行,此時(shí)的進(jìn)程狀態(tài)稱(chēng)為執(zhí)行狀態(tài).

(3)阻塞(Blocked)狀態(tài)正在執(zhí)行的過(guò)程,由于等待某個(gè)事件發(fā)生而無(wú)法執(zhí)行時(shí),便放棄處理機(jī)而處于阻塞狀態(tài).引起進(jìn)程的時(shí)間可能有多種,例如,等待I/O完成,(input),申請(qǐng)緩沖區(qū)不能滿足,等待信件(信號(hào))等.

同步和異步

  所謂同步就是一個(gè)任務(wù)的完成需要依賴另外一個(gè)任務(wù)時(shí),只有等待被依賴的任務(wù)完成后,依賴的任務(wù)才能算完成,這是一種可靠的任務(wù)序列。要么成功都成功,失敗都失敗,兩個(gè)任務(wù)的狀態(tài)可以保持一致。

  所謂異步是不需要等待被依賴的任務(wù)完成,只是通知被依賴的任務(wù)要完成什么工作,依賴的任務(wù)也立即執(zhí)行,只要自己完成了整個(gè)任務(wù)就算完成了。至于被依賴的任務(wù)最終是否真正完成,依賴它的任務(wù)無(wú)法確定,所以它是不可靠的任務(wù)序列。

例如:

比如我去銀行辦理業(yè)務(wù),可能會(huì)有兩種方式:

第一種:選擇排隊(duì)等候;

第二種:選擇取一個(gè)小紙條上面有我的號(hào)碼,等到排到我這一號(hào)時(shí)由柜臺(tái)的人通知我輪到我去辦理業(yè)務(wù)了;

第一種:前者(排隊(duì)等候)就是同步等待消息通知,也就是我要一直在等待銀行辦理業(yè)務(wù)情況;

第二種:后者(等待別人通知)就是異步等待消息通知.在異步消息處理中,等待消息通知者(在這個(gè)例子中就是等待辦理業(yè)務(wù)的人)往往注冊(cè)一個(gè)回調(diào)機(jī)制,在所等待的時(shí)間被觸發(fā)時(shí)由觸發(fā)機(jī)制(在這里是柜臺(tái)的人)通過(guò)某種機(jī)制(在這里是寫(xiě)在小紙條上的號(hào)碼,喊號(hào))找到等待該事件的人

阻塞與非阻塞

  阻塞和非阻塞這兩個(gè)概念與程序(線程)等待消息通知(無(wú)所謂同步或者異步)時(shí)的狀態(tài)有關(guān).也就是說(shuō)阻塞與非阻塞主要程序(線程)等待消息通知時(shí)的狀態(tài)角度來(lái)說(shuō)的

例子:

繼續(xù)上面的那個(gè)例子,不論是排隊(duì)還是使用號(hào)碼等待通知,如果在這個(gè)等待的過(guò)程中,等待者除了等待消息通知之外不能做其它的事情,那么該機(jī)制就是阻塞的,表現(xiàn)在程序中,也就是該程序一直阻塞在該函數(shù)調(diào)用處不能繼續(xù)往下執(zhí)行。

相反,有的人喜歡在銀行辦理這些業(yè)務(wù)的時(shí)候一邊打打電話發(fā)發(fā)短信一邊等待,這樣的狀態(tài)就是非阻塞的,因?yàn)樗?等待者)沒(méi)有阻塞在這個(gè)消息通知上,而是一邊做自己的事情一邊等待。

注意:同步非阻塞形式實(shí)際上是效率低下的,想象一下你一邊打著電話一邊還需要抬頭看到底隊(duì)伍排到你了沒(méi)有。如果把打電話和觀察排隊(duì)的位置看成是程序的兩個(gè)操作的話,這個(gè)程序需要在這兩種不同的行為之間來(lái)回的切換,效率可想而知是低下的;而異步非阻塞形式卻沒(méi)有這樣的問(wèn)題,因?yàn)榇螂娫捠悄?等待者)的事情,而通知你則是柜臺(tái)(消息觸發(fā)機(jī)制)的事情,程序沒(méi)有在兩種不同的操作中來(lái)回切換。

同步/異步與阻塞/非阻塞

  1.同步阻塞形式

  效率最低,拿上面的例子來(lái)說(shuō),就是你專(zhuān)心排隊(duì),什么別的事都不做.

  2.異步阻塞形式

如果在銀行等待辦理業(yè)務(wù)的人采用的是異步的方式去等待消息被觸發(fā)(通知),也就是領(lǐng)了一張小紙條,假如在這段時(shí)間里他不能離開(kāi)銀行做其它的事情,那么很顯然,這個(gè)人被阻塞在了這個(gè)等待的操作上面;

  異步操作是可以被阻塞住的,只不過(guò)它不是在處理消息時(shí)阻塞,而是在等待消息通知時(shí)被阻塞。

  • 同步非阻塞形式
  •   實(shí)際上是效率低下的。

      想象一下你一邊打著電話一邊還需要抬頭看到底隊(duì)伍排到你了沒(méi)有(兩個(gè)操作不能同時(shí)執(zhí)行,因?yàn)槭峭?#xff09;,如果把打電話和觀察排隊(duì)的位置看成是程序的兩個(gè)操作的話,這個(gè)程序需要在這兩種不同的行為之間來(lái)回的切換,效率可想而知是低下的。

  • 異步非阻塞形式
  •   效率更高,

      因?yàn)榇螂娫捠悄?等待者)的事情,而通知你則是柜臺(tái)(消息觸發(fā)機(jī)制)的事情,程序沒(méi)有在兩種不同的操作中來(lái)回切換。

      比如說(shuō),這個(gè)人突然發(fā)覺(jué)自己煙癮犯了,需要出去抽根煙,于是他告訴大堂經(jīng)理說(shuō),排到我這個(gè)號(hào)碼的時(shí)候麻煩到外面通知我一下,那么他就沒(méi)有被阻塞在這個(gè)等待的操作上面,自然這個(gè)就是異步+非阻塞的方式了。

      

    很多人會(huì)把同步和阻塞混淆,是因?yàn)楹芏鄷r(shí)候同步操作會(huì)以阻塞的形式表現(xiàn)出來(lái),同樣的,很多人也會(huì)把異步和非阻塞混淆,因?yàn)楫惒讲僮饕话愣疾粫?huì)在真正的IO操作處被阻塞。

    進(jìn)程的創(chuàng)建與結(jié)束

    進(jìn)程的創(chuàng)建

      但凡是硬件,都需要有操作系統(tǒng)去管理,只要有操作系統(tǒng),就有進(jìn)程的概念,就需要有創(chuàng)建進(jìn)程的方式,一些操作系統(tǒng)只為一個(gè)應(yīng)用程序設(shè)計(jì),比如微波爐中的控制器,一旦啟動(dòng)微波爐,所有的進(jìn)程都已經(jīng)存在。

      而對(duì)于通用系統(tǒng)(跑很多應(yīng)用程序),需要有系統(tǒng)運(yùn)行過(guò)程中創(chuàng)建或撤銷(xiāo)進(jìn)程的能力,主要分為4中形式創(chuàng)建新的進(jìn)程:

      1. 系統(tǒng)初始化(查看進(jìn)程linux中用ps命令,windows中用任務(wù)管理器,前臺(tái)進(jìn)程負(fù)責(zé)與用戶交互,后臺(tái)運(yùn)行的進(jìn)程與用戶無(wú)關(guān),運(yùn)行在后臺(tái)并且只在需要時(shí)才喚醒的進(jìn)程,稱(chēng)為守護(hù)進(jìn)程,如電子郵件、web頁(yè)面、新聞、打印)

      2. 一個(gè)進(jìn)程在運(yùn)行過(guò)程中開(kāi)啟了子進(jìn)程(如nginx開(kāi)啟多進(jìn)程,os.fork,subprocess.Popen等)

      3. 用戶的交互式請(qǐng)求,而創(chuàng)建一個(gè)新進(jìn)程(如用戶雙擊暴風(fēng)影音)

      4. 一個(gè)批處理作業(yè)的初始化(只在大型機(jī)的批處理系統(tǒng)中應(yīng)用)

      無(wú)論哪一種,新進(jìn)程的創(chuàng)建都是由一個(gè)已經(jīng)存在的進(jìn)程執(zhí)行了一個(gè)用于創(chuàng)建進(jìn)程的系統(tǒng)調(diào)用而創(chuàng)建的。

    1. 在UNIX中該系統(tǒng)調(diào)用是:fork,fork會(huì)創(chuàng)建一個(gè)與父進(jìn)程一模一樣的副本,二者有相同的存儲(chǔ)映像、同樣的環(huán)境字符串和同樣的打開(kāi)文件(在shell解釋器進(jìn)程中,執(zhí)行一個(gè)命令就會(huì)創(chuàng)建一個(gè)子進(jìn)程)2. 在windows中該系統(tǒng)調(diào)用是:CreateProcess,CreateProcess既處理進(jìn)程的創(chuàng)建,也負(fù)責(zé)把正確的程序裝入新進(jìn)程。關(guān)于創(chuàng)建子進(jìn)程,UNIX和windows1.相同的是:進(jìn)程創(chuàng)建后,父進(jìn)程和子進(jìn)程有各自不同的地址空間(多道技術(shù)要求物理層面實(shí)現(xiàn)進(jìn)程之間內(nèi)存的隔離),任何一個(gè)進(jìn)程的在其地址空間中的修改都不會(huì)影響到另外一個(gè)進(jìn)程。2.不同的是:在UNIX中,子進(jìn)程的初始地址空間是父進(jìn)程的一個(gè)副本,提示:子進(jìn)程和父進(jìn)程是可以有只讀的共享內(nèi)存區(qū)的。但是對(duì)于windows系統(tǒng)來(lái)說(shuō),從一開(kāi)始父進(jìn)程與子進(jìn)程的地址空間就是不同的。

    進(jìn)程的結(jié)束

      1. 正常退出(自愿,如用戶點(diǎn)擊交互式頁(yè)面的叉號(hào),或程序執(zhí)行完畢調(diào)用發(fā)起系統(tǒng)調(diào)用正常退出,在linux中用exit,在windows中用ExitProcess)

      2. 出錯(cuò)退出(自愿,python a.py中a.py不存在)

      3. 嚴(yán)重錯(cuò)誤(非自愿,執(zhí)行非法指令,如引用不存在的內(nèi)存,1/0等,可以捕捉異常,try...except...)

      4. 被其他進(jìn)程殺死(非自愿,如kill -9)

    在python程序中的進(jìn)程操作

    之前我們已經(jīng)了解了很多進(jìn)程相關(guān)的理論知識(shí),了解進(jìn)程是什么應(yīng)該不再困難了,剛剛我們已經(jīng)了解了,運(yùn)行中的程序就是一個(gè)進(jìn)程。所有的進(jìn)程都是通過(guò)它的父進(jìn)程來(lái)創(chuàng)建的。因此,運(yùn)行起來(lái)的python程序也是一個(gè)進(jìn)程,那么我們也可以在程序中再創(chuàng)建進(jìn)程。多個(gè)進(jìn)程可以實(shí)現(xiàn)并發(fā)效果,也就是說(shuō),當(dāng)我們的程序中存在多個(gè)進(jìn)程的時(shí)候,在某些時(shí)候,就會(huì)讓程序的執(zhí)行速度變快。以我們之前所學(xué)的知識(shí),并不能實(shí)現(xiàn)創(chuàng)建進(jìn)程這個(gè)功能,所以我們就需要借助python中強(qiáng)大的模塊。

    ?

    multiprocessing模塊

    ?仔細(xì)說(shuō)來(lái),multiprocessing不是一個(gè)模塊而是python中一個(gè)操作、管理進(jìn)程的包。 之所以叫multi是取自multiple的多功能的意思,在這個(gè)包中幾乎包含了和進(jìn)程有關(guān)的所有子模塊。由于提供的子模塊非常多,為了方便大家歸類(lèi)記憶,我將這部分大致分為四個(gè)部分:創(chuàng)建進(jìn)程部分,進(jìn)程同步部分,進(jìn)程池部分,進(jìn)程之間數(shù)據(jù)共享。

    multiprocessing.process模塊

    process模塊介紹

    process模塊是一個(gè)創(chuàng)建進(jìn)程的模塊,借助這個(gè)模塊,就可以完成進(jìn)程的創(chuàng)建。

    Process([group [, target [, name [, args [, kwargs]]]]]),由該類(lèi)實(shí)例化得到的對(duì)象,表示一個(gè)子進(jìn)程中的任務(wù)(尚未啟動(dòng))強(qiáng)調(diào): 1. 需要使用關(guān)鍵字的方式來(lái)指定參數(shù) 2. args指定的為傳給target函數(shù)的位置參數(shù),是一個(gè)元組形式,必須有逗號(hào)參數(shù)介紹: group參數(shù)未使用,值始終為None target表示調(diào)用對(duì)象,即子進(jìn)程要執(zhí)行的任務(wù) args表示調(diào)用對(duì)象的位置參數(shù)元組,args=(1,2,'egon',) kwargs表示調(diào)用對(duì)象的字典,kwargs={'name':'egon','age':18} name為子進(jìn)程的名稱(chēng) p.start():啟動(dòng)進(jìn)程,并調(diào)用該子進(jìn)程中的p.run() p.run():進(jìn)程啟動(dòng)時(shí)運(yùn)行的方法,正是它去調(diào)用target指定的函數(shù),我們自定義類(lèi)的類(lèi)中一定要實(shí)現(xiàn)該方法 p.terminate():強(qiáng)制終止進(jìn)程p,不會(huì)進(jìn)行任何清理操作,如果p創(chuàng)建了子進(jìn)程,該子進(jìn)程就成了僵尸進(jìn)程,使用該方法需要特別小心這種情況。如果p還保存了一個(gè)鎖那么也將不會(huì)被釋放,進(jìn)而導(dǎo)致死鎖 p.is_alive():如果p仍然運(yùn)行,返回True p.join([timeout]):主線程等待p終止(強(qiáng)調(diào):是主線程處于等的狀態(tài),而p是處于運(yùn)行的狀態(tài))。timeout是可選的超時(shí)時(shí)間,需要強(qiáng)調(diào)的是,p.join只能join住start開(kāi)啟的進(jìn)程,而不能join住run開(kāi)啟的進(jìn)程 方法介紹 p.daemon:默認(rèn)值為False,如果設(shè)為T(mén)rue,代表p為后臺(tái)運(yùn)行的守護(hù)進(jìn)程,當(dāng)p的父進(jìn)程終止時(shí),p也隨之終止,并且設(shè)定為T(mén)rue后,p不能創(chuàng)建自己的新進(jìn)程,必須在p.start()之前設(shè)置 p.name:進(jìn)程的名稱(chēng) p.pid:進(jìn)程的pid p.exitcode:進(jìn)程在運(yùn)行時(shí)為None、如果為–N,表示被信號(hào)N結(jié)束(了解即可) p.authkey:進(jìn)程的身份驗(yàn)證鍵,默認(rèn)是由os.urandom()隨機(jī)生成的32字符的字符串。這個(gè)鍵的用途是為涉及網(wǎng)絡(luò)連接的底層進(jìn)程間通信提供安全性,這類(lèi)連接只有在具有相同的身份驗(yàn)證鍵時(shí)才能成功(了解即可)屬性介紹 在Windows操作系統(tǒng)中由于沒(méi)有fork(linux操作系統(tǒng)中創(chuàng)建進(jìn)程的機(jī)制),在創(chuàng)建子進(jìn)程的時(shí)候會(huì)自動(dòng)
    import 啟動(dòng)它的這個(gè)文件,而在 import 的時(shí)候又執(zhí)行了整個(gè)文件。因此如果將process()
    直接寫(xiě)在文件中就會(huì)無(wú)限遞歸創(chuàng)建子進(jìn)程報(bào)錯(cuò)。所以必須把創(chuàng)建子進(jìn)程的部分使用if __name__ ==‘__main__’
    判斷保護(hù)起來(lái),import 的時(shí)候 ,就不會(huì)遞歸運(yùn)行了。

    使用process模塊創(chuàng)建進(jìn)程

    在一個(gè)python進(jìn)程中開(kāi)啟子進(jìn)程,start方法和并發(fā)的效果.

    from multiprocessing import Process import timedef func():time.sleep(1)print('這里是son')if __name__ == '__main__':p = Process(target = func)p.start()time.sleep(2)print('這里是father') from multiprocessing import Process import timedef func(name):print('son 的名字是 %s '%name)time.sleep(5)print('這里是son')if __name__ == '__main__':p = Process(target = func,args=('Alex',))p.start()time.sleep(2)p.join()# 代碼執(zhí)行到這里,主進(jìn)程main會(huì)停止等待子進(jìn)程執(zhí)行完畢才繼續(xù)print('這里是father') from multiprocessing import Process import osdef func():print('我是子進(jìn)程,我的進(jìn)程id是%s,我爸爸的id是%s'%(os.getpid(),os.getppid()))if __name__ == '__main__':print('我是main爸爸,我的進(jìn)程id是%s' % os.getpid())for i in range(5):p = Process(target = func,args=())p.start() 查看子進(jìn)程和父進(jìn)程的id號(hào)

    進(jìn)階,多個(gè)進(jìn)程同時(shí)執(zhí)行(注意:子進(jìn)程的執(zhí)行順序并不受開(kāi)啟子進(jìn)程的順序影響)

    from multiprocessing import Process import time def func(i):print('這里是第%s個(gè)子進(jìn)程'%(i))time.sleep(1)if __name__ == '__main__':print('這里是main爸爸')for i in range(5):p = Process(target = func,args=(i,))p.start() 多個(gè)進(jìn)程同時(shí)執(zhí)行 from multiprocessing import Process import time def func(i):print('這里是第%s個(gè)子進(jìn)程'%(i))time.sleep(1)if __name__ == '__main__':for i in range(5):p = Process(target = func,args=(i,))p.start()p.join()# main會(huì)停在這一句,等子進(jìn)程執(zhí)行完,再繼續(xù)走,也就是才再走下一次for循環(huán)print('這里是main爸爸') join在搞事情(1) from multiprocessing import Process import time def func(i):print('這里是第%s個(gè)子進(jìn)程'%(i))time.sleep(1)if __name__ == '__main__':p_l = []for i in range(5):p = Process(target = func,args=(i,))p.start()p_l.append(p)[i.join() for i in p_l]print('這里是main爸爸')

    ?上邊是直接開(kāi)啟多進(jìn)程,接下來(lái)介紹一個(gè)高大上的方法 -- 繼承Process類(lèi)的方式

    from multiprocessing import Process import os class MyProcess(Process):def __init__(self,name):super().__init__()self.name = namedef run(self):print('我是%s,我正在和蒼老師談人生,我的id是%s'%(self.name,os.getpid()))if __name__ == '__main__':p1 = MyProcess('WuSir')p2 = MyProcess('邱老板')p3 = MyProcess('金老板')p1.start()# 調(diào)用start方法,start方法內(nèi)自動(dòng)調(diào)用run方法p2.start()# p2.run()p3.start()p1.join()p2.join()# 注意,如果調(diào)用run方法,就不能再調(diào)用join方法p3.join()print('我是main爸爸')繼承那些事(Process) 繼承那些事(Process)

    ?多進(jìn)程之間關(guān)于數(shù)據(jù)隔離的那些年那些事兒

    from multiprocessing import Processdef func():global nn = 0print('子進(jìn)程內(nèi) n = %s'%n)if __name__ == '__main__':n = 100p = Process(target=func)p.start()print('主進(jìn)程內(nèi) n = %s'%n)

    守護(hù)進(jìn)程? ? ?

    會(huì)隨著父進(jìn)程的結(jié)束而結(jié)束。

    父進(jìn)程創(chuàng)建守護(hù)進(jìn)程

      其一:守護(hù)進(jìn)程會(huì)在父進(jìn)程代碼執(zhí)行結(jié)束后就終止

      其二:守護(hù)進(jìn)程內(nèi)無(wú)法再開(kāi)啟子進(jìn)程,否則拋出異常:AssertionError: daemonic processes are not allowed to have children

    注意:進(jìn)程之間是互相獨(dú)立的,父進(jìn)程代碼運(yùn)行結(jié)束,守護(hù)進(jìn)程隨即終止

    from multiprocessing import Process import timedef func():print('子進(jìn)程開(kāi)始執(zhí)行')time.sleep(2)print('子進(jìn)程結(jié)束執(zhí)行')if __name__ == '__main__':print('主進(jìn)程開(kāi)始執(zhí)行')p = Process(target=func1,)p.daemon = True# 將p 設(shè)置為守護(hù)進(jìn)程,此代碼一定要在start之前設(shè)置。p.start()time.sleep(1)print('主進(jìn)程結(jié)束執(zhí)行') from multiprocessing import Process import timedef func2():print('子進(jìn)程2開(kāi)始執(zhí)行')time.sleep(2)print('子進(jìn)程2結(jié)束執(zhí)行')def func1():print('子進(jìn)程開(kāi)始執(zhí)行')time.sleep(2)print('子進(jìn)程結(jié)束執(zhí)行')if __name__ == '__main__':print('主進(jìn)程開(kāi)始執(zhí)行')p1 = Process(target=func1,)p2 = Process(target=func2)p1.daemon = True# 將p1 設(shè)置為守護(hù)進(jìn)程,此代碼一定要在start之前設(shè)置。p1.start()p2.start()time.sleep(1)# 此時(shí)p1 p2 和main 都已經(jīng)開(kāi)始執(zhí)行print('主進(jìn)程結(jié)束執(zhí)行')# 當(dāng)主進(jìn)程打印完這句話,代表主進(jìn)程結(jié)束,守護(hù)進(jìn)程p1肯定隨之結(jié)束# 但是p2 不是守護(hù)進(jìn)程,不會(huì)結(jié)束,所以此時(shí)程序(也就是主進(jìn)程)會(huì)等待p2結(jié)束之后才結(jié)束。

    socket tcp協(xié)議并發(fā)實(shí)現(xiàn)聊天??

    from multiprocessing import Process import socket from socket import SOL_SOCKET,SO_REUSEADDR SERVER_ADDR = ('127.0.0.1',8080)sk = socket.socket() sk.setsockopt(SOL_SOCKET,SO_REUSEADDR,1) sk.bind(SERVER_ADDR)sk.listen(5)def func(conn):while 1:try:msg_r = conn.recv(1024).decode('utf-8')print(msg_r)if not msg_r:breakconn.send(msg_r.upper().encode('utf-8'))except:breakif __name__ == '__main__':while 1:conn,addr = sk.accept()p = Process(target=func,args=(conn,))p.start()sk.close()socket-tcp協(xié)議并發(fā)實(shí)現(xiàn)_server import socketsk = socket.socket() sk.connect(('127.0.0.1',8080))while 1:msg_s = input('>>>')if not msg_s:continuesk.send(msg_s.encode('utf-8'))print(sk.recv(1024).decode('utf-8')) sk.close()

    ?多進(jìn)程中其他方法?

    from multiprocessing import Process import random import timeclass MyProcess(Process):def __init__(self,name):super(MyProcess, self).__init__()self.name = name# name是父類(lèi)Process中的屬性,這里相當(dāng)于給子進(jìn)程命名def run(self):print('%s 正在撩小姐姐'%self.name)time.sleep(random.randint(1,3))print('%s 還在撩小姐姐'%self.name)if __name__ == '__main__':p = MyProcess('Alex')p.start()time.sleep(0.1)p.terminate()# 將p進(jìn)程殺死的命令。 將任務(wù)提交給操作系統(tǒng),操作系統(tǒng)什么時(shí)候執(zhí)行不受用戶決定print(p.is_alive())# 判斷p進(jìn)程是否還存在time.sleep(1)print(p.is_alive())# 判斷p進(jìn)程是否還存在進(jìn)程的terminate和is_alive方法 from multiprocessing import Process import random import timeclass MyProcess(Process):def __init__(self,name):super(MyProcess, self).__init__()self.name = name# name是父類(lèi)Process中的屬性,這里相當(dāng)于給子進(jìn)程命名def run(self):print('%s 正在撩小姐姐'%self.name)time.sleep(random.randint(1,3))print('%s 還在撩小姐姐'%self.name)if __name__ == '__main__':p = MyProcess('Alex')p.start()print(p.name,p.pid)# 打印進(jìn)程名字,進(jìn)程id號(hào)進(jìn)程的name和pid屬性

    進(jìn)程同步(multiprocessing.Lock、multiprocessing.Semaphore、multiprocessing.Event)

    ? ? ? ?在計(jì)算機(jī)中,有一些硬件和軟件,例如處理器、打印機(jī)等,都屬于競(jìng)爭(zhēng)類(lèi)資源,當(dāng)有需求時(shí),很多進(jìn)程都要爭(zhēng)搶這些資源,而對(duì)于這類(lèi)資源,就屬于臨界資源。當(dāng)多進(jìn)程共同處理某一個(gè)數(shù)據(jù)時(shí),這個(gè)數(shù)據(jù)也就屬于一個(gè)臨界資源。操作系統(tǒng)對(duì)計(jì)算機(jī)內(nèi)各種資源都使其在競(jìng)爭(zhēng)中有序化,但是對(duì)于數(shù)據(jù)來(lái)說(shuō),尤其是用戶動(dòng)態(tài)產(chǎn)生的數(shù)據(jù),當(dāng)處理時(shí)就變成了臨界資源,所以我們作為程序猿來(lái)說(shuō),需要對(duì)臨界資源加以保護(hù),否則就會(huì)出現(xiàn)數(shù)據(jù)混亂現(xiàn)象。這是在提高程序效率的優(yōu)勢(shì)下,帶來(lái)的一個(gè)隱患。小伙伴們,加油吧!

    鎖 —— multiprocessing.Lock??

    通過(guò)剛剛的學(xué)習(xí),我們千方百計(jì)實(shí)現(xiàn)了程序的異步,讓多個(gè)任務(wù)可以同時(shí)在幾個(gè)進(jìn)程中并發(fā)處理,他們之間的運(yùn)行沒(méi)有順序(或者說(shuō)由操作系統(tǒng)調(diào)度決定他們的順序),一旦開(kāi)啟也不受我們控制。盡管并發(fā)編程讓我們能更加充分的利用IO資源,但是也給我們帶來(lái)了新的問(wèn)題。

      當(dāng)多個(gè)進(jìn)程使用同一份數(shù)據(jù)資源的時(shí)候,就會(huì)引發(fā)數(shù)據(jù)安全或順序混亂問(wèn)題。

    from multiprocessing import Process import random import timedef func(addr):print('我是%s'%addr)time.sleep(random.random())print('謝謝!')if __name__ == '__main__':l = ['四川的','湖南的','河南的','江蘇的']for addr in l:p = Process(target=func,args=(addr,))p.start()time.sleep(2)print('\n\n我選%s'%random.choice(l)) # 關(guān)于搶占輸出資源的事情,是指多進(jìn)程并發(fā)執(zhí)行時(shí),并不是一個(gè)進(jìn)程執(zhí)行完任務(wù)后其他進(jìn)程再執(zhí)行。 # 比如 此程序會(huì)輸出:我是四川的 我是河南的 我是江蘇的 謝謝!謝謝!我是湖南的 謝謝! 謝謝! # 而不是 : 我是四川的 謝謝! 我是河南的 謝謝! ...多進(jìn)程關(guān)于搶占輸出資源的事情 from multiprocessing import Process import random import time from multiprocessing import Lock def func(addr,lock):lock.acquire()print('我是%s'%addr)time.sleep(random.random())print('謝謝!')lock.release()if __name__ == '__main__':lock = Lock()l = ['四川的','湖南的','河南的','江蘇的']for addr in l:p = Process(target=func,args=(addr,lock))p.start()time.sleep(4)print('\n\n我選%s'%random.choice(l))

    ?  上面這種情況,使用了加鎖的形式確保了程序的順序執(zhí)行,但是執(zhí)行又變成了串行,降低了效率,但是不得不說(shuō),它確保了數(shù)據(jù)的安全性。

    ? ? ? 下面舉例來(lái)說(shuō)鎖的重要性:模擬12306搶票問(wèn)題。模擬銀行賬戶的存取款問(wèn)題

    # 注意,文件中存儲(chǔ)需要以{'c':1}這種形式,c的引號(hào)一定要帶 # 否則json識(shí)別不出來(lái) # 此代碼的效果,并發(fā)執(zhí)行,但是多進(jìn)程同時(shí)讀寫(xiě)同一個(gè)文件數(shù)據(jù),造成數(shù)據(jù)混亂from multiprocessing import Process,Lock import json import timedef check(i,l):with open('a.txt','r',encoding='utf-8') as f:dic = json.load(f)print('第%s個(gè)人在查票,余票為%s' % (i, dic['c']))pay(i,l)def pay(i,l):with open('a.txt','r',encoding='utf-8') as f:dic = json.load(f)time.sleep(0.5)# 模擬網(wǎng)絡(luò)延遲,當(dāng)購(gòu)買(mǎi)過(guò)程中也會(huì)有網(wǎng)絡(luò)延遲if dic['c']:print('第%s個(gè)人買(mǎi)到票了 '%i)dic['c'] -= 1else:print('第%s個(gè)人沒(méi)買(mǎi)到票'%i)with open('a.txt','w') as f:json.dump(dic,f)if __name__ == '__main__':l = Lock()for i in range(10):p = Process(target=check,args=(i+1,l))p.start()多個(gè)人同時(shí)搶票

    很明顯,上述例子中,因?yàn)槎噙M(jìn)程同時(shí)對(duì)一個(gè)臨界資源(a.txt文件)進(jìn)行了讀寫(xiě)操作,使文件內(nèi)數(shù)據(jù)混亂,也造成了余票為1張,但是很多人都搶到票的假象。那就加鎖來(lái)解決它吧

    from multiprocessing import Process,Lock import json import timedef check(i,l):with open('a.txt','r',encoding='utf-8') as f:dic = json.load(f)print('第%s個(gè)人在查票,余票為%s' % (i, dic['c']))l.acquire()pay(i,l)# 為什么在這里加鎖? 因?yàn)槊總€(gè)人都可以查票,讀取數(shù)據(jù),不會(huì)造成數(shù)據(jù)混亂,但是當(dāng)買(mǎi)票的時(shí)候,就需要對(duì)臨界資源的寫(xiě)入,所以對(duì)寫(xiě)操作加鎖,使某一個(gè)進(jìn)程在寫(xiě)文件時(shí)候,其他進(jìn)程不能碰此文件。l.release()def pay(i,l):with open('a.txt','r',encoding='utf-8') as f:dic = json.load(f)time.sleep(0.5)# 模擬網(wǎng)絡(luò)延遲,當(dāng)購(gòu)買(mǎi)過(guò)程中也會(huì)有網(wǎng)絡(luò)延遲if dic['c']:print('第%s個(gè)人買(mǎi)到票了 '%i)dic['c'] -= 1else:print('第%s個(gè)人沒(méi)買(mǎi)到票'%i)with open('a.txt','w') as f:json.dump(dic,f)if __name__ == '__main__':l = Lock()for i in range(10):p = Process(target=check,args=(i+1,l))p.start()加鎖解決買(mǎi)票問(wèn)題

    ?關(guān)于銀行存取款的問(wèn)題。同一個(gè)賬戶,某個(gè)人一直存,某個(gè)人在同一時(shí)間一直取,如果不對(duì)數(shù)據(jù)進(jìn)行保護(hù)起來(lái),就會(huì)造成的一種數(shù)據(jù)混亂問(wèn)題。

    from multiprocessing import Process, Lock,Valuedef save_money(num):for i in range(100):time.sleep(0.05)num.value += 1def draw_money(num):for i in range(100):time.sleep(0.05)num.value -= 1if __name__ == '__main__':num = Value('i',1000)# 多進(jìn)程中共享數(shù)據(jù),一個(gè)int類(lèi)型的數(shù)據(jù),1000man = Process(target=save_money,args=(num,))woman = Process(target=draw_money,args=(num,))man.start()woman.start()time.sleep(6)print(num.value)錢(qián)多錢(qián)少怪誰(shuí)? from multiprocessing import Process, Lock,Valuedef save_money(num,l):for i in range(100):time.sleep(0.05)l.acquire()num.value += 1l.release()def draw_money(num,l):for i in range(100):time.sleep(0.05)l.acquire()# 在操作存取款的數(shù)據(jù)時(shí),先將數(shù)據(jù)鎖住,不允許其他人更改此數(shù)據(jù)num.value -= 1l.release()if __name__ == '__main__':l = Lock()num = Value('i',1000)# 多進(jìn)程中共享數(shù)據(jù),一個(gè)int類(lèi)型的數(shù)據(jù),1000man = Process(target=save_money,args=(num,l))woman = Process(target=draw_money,args=(num,l))man.start()woman.start()time.sleep(6)print(num.value)這樣才對(duì)!!!

    信號(hào)量 —— multiprocessing.Semaphore(了解)

    # 上述講的Lock,屬于互斥鎖,也就是一把鑰匙配備一把鎖,同時(shí)只允許鎖住某一個(gè)數(shù)據(jù)。而信號(hào)量則是多把鑰匙配備多把鎖,也就是說(shuō)同時(shí)允許鎖住多個(gè)數(shù)據(jù)。比如在一個(gè)粉紅發(fā)廊,里邊有5位服務(wù)人員,那么這個(gè)發(fā)廊最多就同時(shí)允許進(jìn)入5位客人,當(dāng)又有第6位客人來(lái)的時(shí)候,就需要在門(mén)外等待;當(dāng)服務(wù)人員服務(wù)完某位客人后,才允許后續(xù)的人再進(jìn)來(lái)一個(gè),換句話說(shuō),這個(gè)發(fā)廊最多同時(shí)接待5位客人,多的客人必須等待。信號(hào)量同步基于內(nèi)部計(jì)數(shù)器,用戶初始化一個(gè)計(jì)數(shù)器初值(比如上述例子中就初始化為5),每調(diào)用一次acquire(),計(jì)數(shù)器減1;每調(diào)用一次release(),計(jì)數(shù)器加1。當(dāng)計(jì)數(shù)器為0時(shí),acquire()調(diào)用被阻塞。這是迪科斯徹(Dijkstra)信號(hào)量概念P()和V()的Python實(shí)現(xiàn)。信號(hào)量同步機(jī)制適用于訪問(wèn)像服務(wù)器這樣的有限資源。信號(hào)量與進(jìn)程池的概念很像,但是要區(qū)分開(kāi),信號(hào)量涉及到加鎖的概念 信號(hào)量 Semaphore from multiprocessing import Semaphore from multiprocessing import Process import time import randomdef sing(i,se):se.acquire()# 每次進(jìn)來(lái)一位客人,信號(hào)量?jī)?nèi)部計(jì)數(shù)器減1print('%s進(jìn)入小黑屋'%i)time.sleep(random.randint(1,3))print('%s交錢(qián)走人'%i)se.release()# 每次離開(kāi)一位客人,信號(hào)量?jī)?nèi)部計(jì)數(shù)器加1if __name__ == '__main__':se = Semaphore(5)# 初始化5把鑰匙配備5把鎖for i in range(10): # 模擬10個(gè)人要進(jìn)入小黑屋子p = Process(target=sing,args=(i,se))p.start()信號(hào)量機(jī)制舉個(gè)栗子

    事件 —— multiprocessing.Event(了解)?

    python中的事件機(jī)制,主要用于主進(jìn)程控制其他進(jìn)程的執(zhí)行,事件主要提供了三個(gè)方法 set、wait、clear。事件處理的機(jī)制:全局定義了一個(gè)“Flag”(event.is_set()),如果“Flag”值為 False,那么當(dāng)程序執(zhí)行 event.wait 方法時(shí)就會(huì)阻塞,如果“Flag”值為T(mén)rue,那么event.wait 方法時(shí)便不再阻塞。clear:將“Flag”設(shè)置為False set:將“Flag”設(shè)置為T(mén)rue is_set:返回全局‘Flag’的bool值事件 Event def traffic_lights(e):while 1:if e.is_set():# 如果True,代表e.wait() 不阻塞time.sleep(5)# 這段時(shí)間代表綠燈亮的時(shí)間,可以過(guò)車(chē)print('\033[31m紅燈亮!\033[0m')# 該紅燈亮了e.clear()# 將e.is_set()改成False,else:# 執(zhí)行car函數(shù)的進(jìn)程們,讀e.wait,因?yàn)樯线呉呀?jīng)是False,所以e.wait將會(huì)阻塞住time.sleep(5)# 紅燈亮的期間print('\033[32m綠燈亮!\033[0m')# 該綠燈亮了e.set()# 將e.is_set()設(shè)置成True,此時(shí)e.wait()將不再阻塞,車(chē)可以過(guò)def car(i,e):e.wait()# 讀取是否阻塞,如果阻塞,代表在print('第%s輛車(chē)過(guò)'%i)if __name__ == '__main__':e = Event()triff_light = Process(target=traffic_lights,args=(e,))triff_light.start()for i in range(50):cars = Process(target=car,args=(i,e))cars.start()時(shí)間機(jī)制舉個(gè)栗子

    進(jìn)程間通信——隊(duì)列和管道(multiprocess.Queue、multiprocess.Pipe)

    ?進(jìn)程間通信--IPC(Inter-Process Communication)

    IPC的方法:此處介紹隊(duì)列和管道

    隊(duì)列 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

    概念:創(chuàng)建共享的進(jìn)程隊(duì)列,Queue是多進(jìn)程安全的隊(duì)列,可以使用Queue實(shí)現(xiàn)多進(jìn)程之間的數(shù)據(jù)傳遞。

    Queue([maxsize]) 創(chuàng)建共享的進(jìn)程隊(duì)列。 參數(shù) :maxsize是隊(duì)列中允許存在的最大元素個(gè)數(shù)。如果省略此參數(shù),則無(wú)大小限制。 底層隊(duì)列使用管道和鎖定實(shí)現(xiàn)。 Queue([maxsize]) q = Queue([maxsize])q.get( [ block [ ,timeout ] ] ) 返回q中的一個(gè)項(xiàng)目。如果q為空,此方法將阻塞,直到隊(duì)列中有項(xiàng)目可用為止。block用于控制阻塞行為,默認(rèn)為T(mén)rue. 如果設(shè)置為False,將引發(fā)Queue.Empty異常(定義在Queue模塊中)。timeout是可選超時(shí)時(shí)間,用在阻塞模式中。如果在指定的時(shí)間間隔內(nèi)沒(méi)有項(xiàng)目可用,將引發(fā)Queue.Empty異常。q.get_nowait( ) 同q.get(False)方法。q.put(item [, block [,timeout ] ] ) 將item放入隊(duì)列。如果隊(duì)列已滿,此方法將阻塞至有空間可用為止。block控制阻塞行為,默認(rèn)為T(mén)rue。如果設(shè)置為False,將引發(fā)Queue.Empty異常(定義在Queue庫(kù)模塊中)。timeout指定在阻塞模式中等待可用空間的時(shí)間長(zhǎng)短。超時(shí)后將引發(fā)Queue.Full異常。q.qsize() 返回隊(duì)列中目前項(xiàng)目的正確數(shù)量。此函數(shù)的結(jié)果并不可靠,因?yàn)樵诜祷亟Y(jié)果和在稍后程序中使用結(jié)果之間,隊(duì)列中可能添加或刪除了項(xiàng)目。在某些系統(tǒng)上,此方法可能引發(fā)NotImplementedError異常。q.empty() 如果調(diào)用此方法時(shí) q為空,返回True。如果其他進(jìn)程或線程正在往隊(duì)列中添加項(xiàng)目,結(jié)果是不可靠的。也就是說(shuō),在返回和使用結(jié)果之間,隊(duì)列中可能已經(jīng)加入新的項(xiàng)目。q.full() 如果q已滿,返回為T(mén)rue. 由于線程的存在,結(jié)果也可能是不可靠的(參考q.empty()方法)。。方法介紹Queue中的方法介紹 q.close() 關(guān)閉隊(duì)列,防止隊(duì)列中加入更多數(shù)據(jù)。調(diào)用此方法時(shí),后臺(tái)線程將繼續(xù)寫(xiě)入那些已入隊(duì)列但尚未寫(xiě)入的數(shù)據(jù),但將在此方法完成時(shí)馬上關(guān)閉。如果q被垃圾收集,將自動(dòng)調(diào)用此方法。關(guān)閉隊(duì)列不會(huì)在隊(duì)列使用者中生成任何類(lèi)型的數(shù)據(jù)結(jié)束信號(hào)或異常。例如,如果某個(gè)使用者正被阻塞在get()操作上,關(guān)閉生產(chǎn)者中的隊(duì)列不會(huì)導(dǎo)致get()方法返回錯(cuò)誤。q.cancel_join_thread() 不會(huì)再進(jìn)程退出時(shí)自動(dòng)連接后臺(tái)線程。這可以防止join_thread()方法阻塞。q.join_thread() 連接隊(duì)列的后臺(tái)線程。此方法用于在調(diào)用q.close()方法后,等待所有隊(duì)列項(xiàng)被消耗。默認(rèn)情況下,此方法由不是q的原始創(chuàng)建者的所有進(jìn)程調(diào)用。調(diào)用q.cancel_join_thread()方法可以禁止這種行為。其他方法(了解)需要你了解的幾個(gè)方法

    ?代碼示例??

    from multiprocessing import Queueq = Queue(4) q.put(1) q.put(2) q.put(3) q.put(4) # q.put(5) #如果是put,因?yàn)橐呀?jīng)放滿數(shù)據(jù),所以程序會(huì)阻塞在put,等待取出數(shù)據(jù) # q.put_nowait(5) # 如果是put_nowait() ,不會(huì)阻塞,直接放入隊(duì)列數(shù)據(jù),隊(duì)列滿則報(bào)異常 try:q.put_nowait(5)# 在此處用try直接處理異常。此時(shí)數(shù)據(jù)不會(huì)放入到隊(duì)列,會(huì)被直接丟棄 except:print('隊(duì)列已滿')print(q.get()) print(q.get()) print(q.get()) print(q.get()) # print(q.get())# 此處和上邊一樣,因?yàn)殛?duì)列中已空,所以程序會(huì)阻塞在get,等待放入數(shù)據(jù) # q.get_nowait() # 不會(huì)阻塞,直接從隊(duì)列中獲取數(shù)據(jù),獲取不到則報(bào)錯(cuò) try:q.get_nowait()# 在此處用try處理錯(cuò)誤,此時(shí)獲取不到數(shù)據(jù),直接跳過(guò) except:print('隊(duì)列已空')了解隊(duì)列的用法 了解隊(duì)列的用法

    ?上面這個(gè)例子還沒(méi)有加入進(jìn)程通信,只是先來(lái)看看隊(duì)列為我們提供的方法,以及這些方法的使用和現(xiàn)象。

    from multiprocessing import Queue,Process import time def func(q):# time.sleep(1)q.put('我是四川的')if __name__ == '__main__':q = Queue(5)p = Process(target=func,args=(q,))p.start()#print(q.get_nowait())# 此處,可能會(huì)報(bào)錯(cuò),因?yàn)樽舆M(jìn)程和父進(jìn)程同時(shí)運(yùn)行,不一定隊(duì)列中有數(shù)據(jù)print(q.get())# 此處一定不會(huì)報(bào)錯(cuò),因?yàn)間et是阻塞獲取數(shù)據(jù),如果隊(duì)列沒(méi)有就等著多進(jìn)程中使用隊(duì)列 多進(jìn)程中使用隊(duì)列

    上面是一個(gè)queue的簡(jiǎn)單應(yīng)用,使用隊(duì)列q對(duì)象調(diào)用get函數(shù)來(lái)取得隊(duì)列中最先進(jìn)入的數(shù)據(jù)。 接下來(lái)看一個(gè)稍微復(fù)雜一些的例子:

    from multiprocessing import Process, Queue,freeze_support import random import osdef put_func(q):info = str(os.getpid()) + '\t:\t' + str(random.randint(0, 100))q.put(info)def get_func(q):print('%s 獲取到數(shù)據(jù) :\033[33m; %s \033[0m' % (os.getpid(), q.get()))if __name__ == '__main__':# freeze_support() 如果有windows系統(tǒng)開(kāi)啟多進(jìn)程導(dǎo)致程序崩潰,可嘗試調(diào)用此函數(shù)q = Queue(5)l_put = []l_get = []for i in range(10):p_put = Process(target=put_func, args=(q,))p_put.start()l_put.append(p_put)for i in range(10):p_get = Process(target=get_func, args=(q,))p_get.start()l_put.append(p_get)# [i.join() for i in l_put]# [i.join() for i in l_get]批量數(shù)據(jù)放入隊(duì)列并批量獲取 批量數(shù)據(jù)放入隊(duì)列并批量獲取

    生產(chǎn)者消費(fèi)者模型 ? ??

    在并發(fā)編程中使用生產(chǎn)者和消費(fèi)者模式能夠解決絕大多數(shù)并發(fā)問(wèn)題。該模式通過(guò)平衡生產(chǎn)進(jìn)程和消費(fèi)進(jìn)程的工作能力來(lái)提高程序的整體處理數(shù)據(jù)的速度。

    舉個(gè)應(yīng)用栗子:全棧開(kāi)發(fā)時(shí)候,前端接收客戶請(qǐng)求,后端處理請(qǐng)求邏輯。當(dāng)某時(shí)刻客戶請(qǐng)求過(guò)于多的時(shí)候,后端處理不過(guò)來(lái),此時(shí)完全可以借助隊(duì)列來(lái)輔助,將客戶請(qǐng)求放入隊(duì)列中,后端邏輯代碼處理完一批客戶請(qǐng)求后馬上從隊(duì)列中繼續(xù)獲取,這樣平衡兩端的效率。

    為什么要使用生產(chǎn)者和消費(fèi)者模式

    進(jìn)程世界里,生產(chǎn)者就是生產(chǎn)數(shù)據(jù)的進(jìn)程,消費(fèi)者就是消費(fèi)數(shù)據(jù)的進(jìn)程。在多進(jìn)程開(kāi)發(fā)當(dāng)中,如果生產(chǎn)者處理速度很快,而消費(fèi)者處理速度很慢,那么生產(chǎn)者就必須等待消費(fèi)者處理完,才能繼續(xù)生產(chǎn)數(shù)據(jù)。同樣的道理,如果消費(fèi)者的處理能力大于生產(chǎn)者,那么消費(fèi)者就必須等待生產(chǎn)者。為了解決這個(gè)問(wèn)題于是引入了生產(chǎn)者和消費(fèi)者模式。

    什么是生產(chǎn)者消費(fèi)者模式

    生產(chǎn)者消費(fèi)者模式是通過(guò)一個(gè)容器來(lái)解決生產(chǎn)者和消費(fèi)者的強(qiáng)耦合問(wèn)題。生產(chǎn)者和消費(fèi)者彼此之間不直接通訊,而通過(guò)阻塞隊(duì)列來(lái)進(jìn)行通訊,所以生產(chǎn)者生產(chǎn)完數(shù)據(jù)之后不用等待消費(fèi)者處理,直接扔給阻塞隊(duì)列,消費(fèi)者不找生產(chǎn)者要數(shù)據(jù),而是直接從阻塞隊(duì)列里取,阻塞隊(duì)列就相當(dāng)于一個(gè)緩沖區(qū),平衡了生產(chǎn)者和消費(fèi)者的處理能力。

    基于隊(duì)列實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型
    from multiprocessing import Queue,Process import time import randomdef get_func(q):while 1:time.sleep(random.randint(1, 3))info = q.get()print('\033[32m廠長(zhǎng)拿走了%s \033[0m'%info)def put_func(q):for i in range(20):info = '娃娃%s號(hào)'%iq.put(info)print('\033[31m生產(chǎn)了%s \033[0m' % info)time.sleep(random.randint(1, 3))if __name__ == '__main__':q = Queue(5)p_get = Process(target=get_func, args=(q,))p_put = Process(target=put_func, args=(q,))p_get.start()p_put.start()基于隊(duì)列的生產(chǎn)者消費(fèi)者模型

    ?上述代碼是基于隊(duì)列實(shí)現(xiàn)的生產(chǎn)者消費(fèi)者模型,生產(chǎn)者一直在生產(chǎn)娃娃,消費(fèi)者一直在從隊(duì)列中獲取娃娃,但是消費(fèi)者因?yàn)椴恢郎a(chǎn)者要生產(chǎn)多少娃娃,也不知道生產(chǎn)者何時(shí)就不生產(chǎn)了,所以消費(fèi)者需要一個(gè)死循環(huán)一直嘗試去從隊(duì)列中獲取娃娃,那么此時(shí)問(wèn)題就出現(xiàn)了,3個(gè)進(jìn)程,主進(jìn)程開(kāi)啟了兩個(gè)子進(jìn)程分別為生產(chǎn)者和消費(fèi)者,當(dāng)生產(chǎn)者生產(chǎn)完數(shù)據(jù)后,生產(chǎn)者結(jié)束,消費(fèi)者一直在嘗試接收數(shù)據(jù),那么問(wèn)題就出在了消費(fèi)者的get方法這里,當(dāng)get不到數(shù)據(jù)時(shí)候就一直阻塞,那么主進(jìn)程就一直等待,此時(shí)程序就不會(huì)結(jié)束了。

    解決方法也很簡(jiǎn)單,可以嘗試讓生產(chǎn)者在生產(chǎn)完數(shù)據(jù)后,再往隊(duì)列中放一個(gè)結(jié)束生產(chǎn)的信號(hào),當(dāng)消費(fèi)者接受到信號(hào)后,自動(dòng)的break出死循環(huán)即可。

    from multiprocessing import Queue,Process import time import randomdef get_func(q):while 1:time.sleep(random.randint(1, 3))info = q.get()if info == None:break# 當(dāng)獲取到結(jié)束生產(chǎn)的標(biāo)識(shí)時(shí),消費(fèi)者自動(dòng)break出死循環(huán)print('\033[32m廠長(zhǎng)拿走了%s \033[0m'%info)def put_func(q):for i in range(20):info = '娃娃%s號(hào)'%iq.put(info)print('\033[31m生產(chǎn)了%s \033[0m' % info)time.sleep(random.randint(1, 3))q.put(None)# 放入一個(gè)結(jié)束生產(chǎn)的標(biāo)識(shí)if __name__ == '__main__':q = Queue(5)p_get = Process(target=get_func, args=(q,))p_put = Process(target=put_func, args=(q,))p_get.start()p_put.start()修正版-消費(fèi)者生產(chǎn)者模型

    ?注意:上述代碼中,生產(chǎn)者放入的停止生產(chǎn)的標(biāo)識(shí),放入標(biāo)識(shí)這件事其實(shí)交給主進(jìn)程來(lái)做也可以,但是此時(shí)就需要主進(jìn)程獲取到生產(chǎn)者什么時(shí)候結(jié)束生產(chǎn)。

    from multiprocessing import Queue,Process import time import randomdef get_func(q):while 1:time.sleep(random.randint(1, 3))info = q.get()if info == None:break# 當(dāng)獲取到結(jié)束生產(chǎn)的標(biāo)識(shí)時(shí),消費(fèi)者自動(dòng)break出死循環(huán)print('\033[32m廠長(zhǎng)拿走了%s \033[0m'%info)def put_func(q):for i in range(20):info = '娃娃%s號(hào)'%iq.put(info)print('\033[31m生產(chǎn)了%s \033[0m' % info)time.sleep(random.randint(1, 3))if __name__ == '__main__':q = Queue(5)p_get = Process(target=get_func, args=(q,))p_put = Process(target=put_func, args=(q,))p_get.start()p_put.start()p_put.join()# 讓主進(jìn)程可以獲取到生產(chǎn)者結(jié)束生產(chǎn)q.put(None)主進(jìn)程發(fā)送結(jié)束生產(chǎn)標(biāo)識(shí)

    ?當(dāng)小伙子們嘗試上述這個(gè)代碼時(shí),發(fā)現(xiàn)所有問(wèn)題都阻擋不了你成功的腳步了,但是!!你有沒(méi)有嘗試過(guò)多個(gè)生產(chǎn)者多個(gè)消費(fèi)者的模型?what fuck? 現(xiàn)在的解決方案是不是就很 low bee了!因?yàn)槟銜?huì)發(fā)現(xiàn):(標(biāo)題)

    from multiprocessing import Queue,Process import time import randomdef get_func(q,consumer):while 1:time.sleep(random.randint(1, 3))info = q.get()if info == None:break# 當(dāng)獲取到結(jié)束生產(chǎn)的標(biāo)識(shí)時(shí),消費(fèi)者自動(dòng)break出死循環(huán)print('\033[32m%s 拿走了%s \033[0m'%(consumer,info))def put_func(q,product):for i in range(5):info = '%s %s號(hào)'%(product,i)q.put(info)print('\033[31m生產(chǎn)了%s \033[0m' % info)time.sleep(random.randint(1, 3))if __name__ == '__main__':q = Queue(5)con1 = Process(target=get_func, args=(q,'Alex'))con2 = Process(target=get_func, args=(q,'WuSir'))pro1 = Process(target=put_func, args=(q,'蒼老師版'))pro2 = Process(target=put_func, args=(q,'小澤瑪雅麗版'))pro3 = Process(target=put_func, args=(q,'島國(guó)米飯保你愛(ài)版'))pro1.start()pro2.start()pro3.start()con1.start()con2.start()pro1.join()# 讓主進(jìn)程可以獲取到生產(chǎn)者結(jié)束生產(chǎn)pro2.join()# 主進(jìn)程必須等待所有生產(chǎn)者生產(chǎn)完畢后才可以放結(jié)束生產(chǎn)的信號(hào)pro3.join()q.put(None)# 有幾個(gè)消費(fèi)者就應(yīng)該給幾個(gè)信號(hào)q.put(None)多個(gè)消費(fèi)者:有幾個(gè)消費(fèi)者就應(yīng)該放幾個(gè)結(jié)束生產(chǎn)標(biāo)識(shí)

    JoinableQueue([maxsize])?

    ?創(chuàng)建可連接的共享隊(duì)列進(jìn)程。它就好像一個(gè)Queue對(duì)象,但是它自帶光環(huán),允許消費(fèi)者通知生產(chǎn)者是不是已經(jīng)消費(fèi)完所有的數(shù)據(jù)了。通知進(jìn)程是使用共享的信號(hào)和條件變量來(lái)實(shí)現(xiàn)的。?

    老樣子,先來(lái)接收一下JoinableQueue給咱們提供的方法:

    JoinableQueue的實(shí)例p除了與Queue對(duì)象相同的方法之外,還具有以下方法:q.task_done() 消費(fèi)者使用此方法發(fā)出信號(hào),表示隊(duì)列中放入的數(shù)據(jù)已經(jīng)被處理。如果調(diào)用此方法的次數(shù)大于從隊(duì)列中獲取的數(shù)據(jù)數(shù)量,將引發(fā)ValueError異常。q.join() 生產(chǎn)者將使用此方法進(jìn)行阻塞,直到隊(duì)列中所有項(xiàng)目均被處理。阻塞將持續(xù)到消費(fèi)者為隊(duì)列中的每個(gè)數(shù)據(jù)均調(diào)用q.task_done()方法為止。 方法介紹

    下面舉個(gè)栗子,建立一個(gè)永遠(yuǎn)運(yùn)行的進(jìn)程,來(lái)無(wú)限制的消費(fèi)生產(chǎn)者的數(shù)據(jù),生產(chǎn)者只需要將數(shù)據(jù)放入隊(duì)列并等待被處理即可

    from multiprocessing import JoinableQueue,Process import time import randomdef get_func(q,consumer):while 1:time.sleep(random.randint(1, 3))info = q.get()print('\033[32m%s 拿走了%s \033[0m'%(consumer,info))q.task_done()# 消費(fèi)者每消費(fèi)一個(gè)數(shù)據(jù),就要返回一次標(biāo)識(shí)給q.join,證明數(shù)據(jù)已經(jīng)被消費(fèi)def put_func(q,product):for i in range(5):info = '%s %s號(hào)'%(product,i)q.put(info)print('\033[31m生產(chǎn)了%s \033[0m' % info)time.sleep(random.randint(1, 3))q.join()# 生產(chǎn)完畢,使用此方法進(jìn)行阻塞,直到隊(duì)列中所有數(shù)據(jù)均被處理。if __name__ == '__main__':q = JoinableQueue(5)con1 = Process(target=get_func, args=(q,'Alex'))con2 = Process(target=get_func, args=(q,'WuSir'))pro1 = Process(target=put_func, args=(q,'蒼老師版'))pro2 = Process(target=put_func, args=(q,'小澤瑪雅麗版'))pro3 = Process(target=put_func, args=(q,'島國(guó)米飯保你愛(ài)版'))l_p = [pro1,pro2,pro3,con1,con2]for i in l_p:i.start()pro1.join()pro2.join()pro3.join() # 此代碼的大體邏輯:主進(jìn)程開(kāi)啟3個(gè)生產(chǎn)者和2個(gè)消費(fèi)者,合計(jì)6個(gè)進(jìn)程在并發(fā)執(zhí)行。 # 主進(jìn)程等待 pro1 pro2 pro3的執(zhí)行完畢 # pro1 pro2 pro3 進(jìn)程中都有q.join(),會(huì)等待消費(fèi)者con1 con2消費(fèi)完所以數(shù)據(jù) # 即 :主進(jìn)程在等pro1 pro2 pro3 ,而pro1 pro2 pro3 在等 con1 con2 # 此代碼中消費(fèi)者進(jìn)程con1 con2 會(huì)一直阻塞在q.get等待接收數(shù)據(jù),而造成程序不會(huì)結(jié)束 # 如果程序想要結(jié)束.......小伙子,試試把con1 con2設(shè)置成守護(hù)進(jìn)程試試JoinableQueue實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模型

    管道(了解)?

    #創(chuàng)建管道的類(lèi): Pipe([duplex]):在進(jìn)程之間創(chuàng)建一條管道,并返回元組(conn1,conn2),其中conn1,conn2表示管道兩端的連接對(duì)象,強(qiáng)調(diào)一點(diǎn):必須在產(chǎn)生Process對(duì)象之前產(chǎn)生管道 #參數(shù)介紹: dumplex:默認(rèn)管道是全雙工的,即conn1和conn2都是既能收數(shù)據(jù)也能發(fā)數(shù)據(jù)的,如果將duplex設(shè)成False,conn1只能用于接收,conn2只能用于發(fā)送。 #主要方法:conn1.recv():接收conn2.send(obj)發(fā)送的對(duì)象。如果沒(méi)有消息可接收,recv方法會(huì)一直阻塞。如果連接的另外一端已經(jīng)關(guān)閉,那么recv方法會(huì)拋出EOFError。conn1.send(obj):通過(guò)連接發(fā)送對(duì)象。obj是與序列化兼容的任意對(duì)象#其他方法: conn1.close():關(guān)閉連接。如果conn1被垃圾回收,將自動(dòng)調(diào)用此方法 conn1.fileno():返回連接使用的整數(shù)文件描述符 conn1.poll([timeout]):如果連接上的數(shù)據(jù)可用,返回True。timeout指定等待的最長(zhǎng)時(shí)限。如果省略此參數(shù),方法將立即返回結(jié)果。如果將timeout設(shè)成None,操作將無(wú)限期地等待數(shù)據(jù)到達(dá)。conn1.recv_bytes([maxlength]):接收c.send_bytes()方法發(fā)送的一條完整的字節(jié)消息。maxlength指定要接收的最大字節(jié)數(shù)。如果進(jìn)入的消息,超過(guò)了這個(gè)最大值,將引發(fā)IOError異常,并且在連接上無(wú)法進(jìn)行進(jìn)一步讀取。如果連接的另外一端已經(jīng)關(guān)閉,再也不存在任何數(shù)據(jù),將引發(fā)EOFError異常。 conn.send_bytes(buffer [, offset [, size]]):通過(guò)連接發(fā)送字節(jié)數(shù)據(jù)緩沖區(qū),buffer是支持緩沖區(qū)接口的任意對(duì)象,offset是緩沖區(qū)中的字節(jié)偏移量,而size是要發(fā)送字節(jié)數(shù)。結(jié)果數(shù)據(jù)以單條消息的形式發(fā)出,然后調(diào)用c.recv_bytes()函數(shù)進(jìn)行接收 conn1.recv_bytes_into(buffer [, offset]):接收一條完整的字節(jié)消息,并把它保存在buffer對(duì)象中,該對(duì)象支持可寫(xiě)入的緩沖區(qū)接口(即bytearray對(duì)象或類(lèi)似的對(duì)象)。offset指定緩沖區(qū)中放置消息處的字節(jié)位移。返回值是收到的字節(jié)數(shù)。如果消息長(zhǎng)度大于可用的緩沖區(qū)空間,將引發(fā)BufferTooShort異常。介紹管道的介紹 from multiprocessing import Process, Pipe import timedef son(conn2):time.sleep(1)print(conn2.recv())conn2.send('我是你爺爺')if __name__ == '__main__':conn1, conn2 = Pipe()p = Process(target=son, args=(conn2,))p.start()conn1.send('我是你爸爸!') # conn1既能發(fā)數(shù)據(jù)time.sleep(1)print(conn1.recv()) # conn1 也能接數(shù)據(jù)p.join()管道的初使用

    ?應(yīng)該特別注意管道端點(diǎn)的正確管理問(wèn)題。如果是生產(chǎn)者或消費(fèi)者中都沒(méi)有使用管道的某個(gè)端點(diǎn),就應(yīng)將它關(guān)閉。這也說(shuō)明了為何在生產(chǎn)者中關(guān)閉了管道的輸出端,在消費(fèi)者中關(guān)閉管道的輸入端。如果忘記執(zhí)行這些步驟,程序可能在消費(fèi)者中的recv()操作上掛起。管道是由操作系統(tǒng)進(jìn)行引用計(jì)數(shù)的,必須在所有進(jìn)程中關(guān)閉管道后才能生成EOFError異常。因此,在生產(chǎn)者中關(guān)閉管道不會(huì)有任何效果,除非消費(fèi)者也關(guān)閉了相同的管道端點(diǎn)。

    from multiprocessing import Process, Pipedef son(conn2,conn1):# conn1.close() # 不寫(xiě)就不會(huì)發(fā)生EOFError異常while 1:try:print(conn2.recv())conn2.send('我是你爺爺')except EOFError:# print(123) # 驗(yàn)證確實(shí)發(fā)生了EOFError異常conn2.close()breakif __name__ == '__main__':conn1, conn2 = Pipe()p = Process(target=son, args=(conn2,conn1))p.start()conn2.close()conn1.send('我是你爸爸!') # conn1既能發(fā)數(shù)據(jù)print(conn1.recv()) # conn1 也能接數(shù)據(jù)conn1.close()自己整個(gè)異常玩玩 from multiprocessing import Pipe, Process import time import randomdef consumer(conn, man):conn1, conn2 = connconn1.close()while 1:try:info = conn2.recv()time.sleep(random.random())print('\033[31m%s 取走了%s\033[0m' % (man, info))except EOFError:print('\033[32m沒(méi)有娃娃了,等下一期吧\033[0m')conn2.close()break # 借助一定產(chǎn)生的EOFError異常來(lái)讓程序結(jié)束def producer(conn, pro):conn1, conn2 = connconn2.close()for i in range(10):info = '%s 的娃娃%s號(hào)' % (pro, i)conn1.send(info)conn1.close()if __name__ == '__main__':conn1, conn2 = Pipe()cons1 = Process(target=consumer, args=((conn1, conn2), 'alex'))prod1 = Process(target=producer, args=((conn1, conn2), '蒼老師版'))cons1.start()prod1.start()conn1.close() # 不寫(xiě)的話,消費(fèi)者進(jìn)程結(jié)束不了。 一定要記住,多進(jìn)程中內(nèi)核會(huì)對(duì)每個(gè)進(jìn)程的管道進(jìn)行計(jì)數(shù),必須在所有進(jìn)程中都關(guān)閉管道才會(huì)引發(fā)EOFError異常conn2.close()pipe實(shí)現(xiàn)的生產(chǎn)者消費(fèi)者模型 from multiprocessing import Pipe, Process, Lockdef consumer(conn, man,color,l):conn1, conn2 = connconn1.close()while 1:l.acquire()info = conn2.recv()l.release()if info:print('\033[%s %s 取走了%s\033[0m' % (color,man, info))else:conn2.close()breakdef producer(conn, pro):conn1, conn2 = connconn2.close()for i in range(20):info = '%s 的娃娃%s號(hào)' % (pro, i)conn1.send(info)conn1.send(None)conn1.send(None)conn1.send(None)conn1.close()if __name__ == '__main__':conn1, conn2 = Pipe()l = Lock()cons1 = Process(target=consumer, args=((conn1, conn2), 'alex','31m',l))cons2 = Process(target=consumer, args=((conn1, conn2), 'Wusir','33m',l))cons3 = Process(target=consumer, args=((conn1, conn2), '太白','34m',l))cons4 = Process(target=consumer, args=((conn1, conn2), '彥濤','35m',l))cons5 = Process(target=consumer, args=((conn1, conn2), 'AAA','36m',l))cons6 = Process(target=consumer, args=((conn1, conn2), 'BBB','37m',l))prod1 = Process(target=producer, args=((conn1, conn2), '蒼老師版'))prod2 = Process(target=producer, args=((conn1, conn2), '韓紅版'))l_p = [cons1,cons2,cons3,cons4,cons5,cons6,prod1,prod2,][i.start() for i in l_p]conn1.close()conn2.close()[i.join() for i in l_p]多個(gè)消費(fèi)者競(jìng)爭(zhēng)數(shù)據(jù)帶來(lái)了數(shù)據(jù)不安全的問(wèn)題

    進(jìn)程直接的數(shù)據(jù)共享 ? ? ? ? ? ?

    展望未來(lái),基于消息傳遞的并發(fā)編程是大勢(shì)所趨

    即便是使用線程,推薦做法也是將程序設(shè)計(jì)為大量獨(dú)立的線程集合,通過(guò)消息隊(duì)列交換數(shù)據(jù)。

    這樣極大地減少了對(duì)使用鎖定和其他同步手段的需求,還可以擴(kuò)展到分布式系統(tǒng)中。

    但進(jìn)程間應(yīng)該盡量避免通信,即便需要通信,也應(yīng)該選擇進(jìn)程安全的工具來(lái)避免加鎖帶來(lái)的問(wèn)題。

    以后我們會(huì)嘗試使用數(shù)據(jù)庫(kù)來(lái)解決現(xiàn)在進(jìn)程之間的數(shù)據(jù)共享問(wèn)題。

    進(jìn)程間數(shù)據(jù)是獨(dú)立的,可以借助于隊(duì)列或管道實(shí)現(xiàn)通信,二者都是基于消息傳遞的 雖然進(jìn)程間數(shù)據(jù)獨(dú)立,但可以通過(guò)Manager實(shí)現(xiàn)數(shù)據(jù)共享,事實(shí)上Manager的功能遠(yuǎn)不止于此A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.A manager returned by Manager() will support types list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.Manager模塊官方說(shuō)法 from multiprocessing import Manager,Process,Lockdef func(dic,lock):# lock.acquire() # 使用manager模塊,多進(jìn)程共享數(shù)據(jù)時(shí),如果不加鎖,必然會(huì)造成數(shù)據(jù)混亂dic[0] -= 1# lock.release()if __name__ == '__main__':m = Manager()lock = Lock()s = m.list([50])print(s)l = []for i in range(50):p = Process(target=func,args=(s,lock))p.start()l.append(p)[p.join() for p in l]print(s[0])Manager模塊的簡(jiǎn)單用法

    進(jìn)程池和multiprocessing.Pool 模塊 ? ? ?

    進(jìn)程池 ? ? ? ?

    為什么要有進(jìn)程池?進(jìn)程池的概念。

    在程序?qū)嶋H處理問(wèn)題過(guò)程中,忙時(shí)會(huì)有成千上萬(wàn)的任務(wù)需要被執(zhí)行,閑時(shí)可能只有零星任務(wù)。那么在成千上萬(wàn)個(gè)任務(wù)需要被執(zhí)行的時(shí)候,我們就需要去創(chuàng)建成千上萬(wàn)個(gè)進(jìn)程么?首先,創(chuàng)建進(jìn)程需要消耗時(shí)間,銷(xiāo)毀進(jìn)程也需要消耗時(shí)間。第二即便開(kāi)啟了成千上萬(wàn)的進(jìn)程,操作系統(tǒng)也不能讓他們同時(shí)執(zhí)行,這樣反而會(huì)影響程序的效率。因此我們不能無(wú)限制的根據(jù)任務(wù)開(kāi)啟或者結(jié)束進(jìn)程。那么我們要怎么做呢?

    在這里,要給大家介紹一個(gè)進(jìn)程池的概念,定義一個(gè)池子,在里面放上固定數(shù)量的進(jìn)程,有需求來(lái)了,就拿這個(gè)池中的進(jìn)程來(lái)處理任務(wù),等到處理完畢,進(jìn)程并不結(jié)束,而是將進(jìn)程再放回進(jìn)程池中繼續(xù)等待任務(wù)。如果有很多任務(wù)需要執(zhí)行,池中的進(jìn)程數(shù)量不夠,任務(wù)就要等待之前的進(jìn)程執(zhí)行任務(wù)完畢歸來(lái),拿到空閑進(jìn)程才能繼續(xù)執(zhí)行。也就是說(shuō),池中進(jìn)程的數(shù)量是固定的,那么同一時(shí)間最多有固定數(shù)量的進(jìn)程在運(yùn)行。這樣不會(huì)增加操作系統(tǒng)的調(diào)度難度,還節(jié)省了開(kāi)閉進(jìn)程的時(shí)間,也一定程度上能夠?qū)崿F(xiàn)并發(fā)效果。

    舉個(gè)栗子:在小黑屋子里(池)有4個(gè)小姐姐(進(jìn)程)一直在等待服務(wù)客人,當(dāng)有1個(gè)客人來(lái),就派一個(gè)小姐姐去服務(wù),當(dāng)有很多人來(lái),就得等哪個(gè)小姐姐服務(wù)完上個(gè)人之后再繼續(xù)去服務(wù)下一個(gè)人。

    multiprocessing.Pool 模塊

    p = Pool([numprocess [,initializer [, initargs]]]):創(chuàng)建進(jìn)程池1 numprocess:要?jiǎng)?chuàng)建的進(jìn)程數(shù),如果省略,將默認(rèn)使用cpu_count()的值 2 initializer:是每個(gè)工作進(jìn)程啟動(dòng)時(shí)要執(zhí)行的可調(diào)用對(duì)象,默認(rèn)為None 3 initargs:是要傳給initializer的參數(shù)組 p.apply(func [, args [, kwargs]]):在一個(gè)池工作進(jìn)程中執(zhí)行func(*args,**kwargs),然后返回結(jié)果。 '''需要強(qiáng)調(diào)的是:此操作并不會(huì)在所有池工作進(jìn)程中并執(zhí)行func函數(shù)。如果要通過(guò)不同參數(shù)并發(fā)地執(zhí)行func函數(shù),必須從不同線程調(diào)用p.apply()函數(shù)或者使用p.apply_async()'''p.apply_async(func [, args [, kwargs]],callback=None):在一個(gè)池工作進(jìn)程中執(zhí)行func(*args,**kwargs),然后返回結(jié)果。 '''此方法的結(jié)果是AsyncResult類(lèi)的實(shí)例,callback是可調(diào)用對(duì)象,接收輸入?yún)?shù)。當(dāng)func的結(jié)果變?yōu)榭捎脮r(shí),將結(jié)果傳遞給callback。callback禁止執(zhí)行任何阻塞操作,否則將接收其他異步操作中的結(jié)果。'''p.map( func, iterable):將iterable序列中每一個(gè)元素當(dāng)成參數(shù)傳遞給func,異步執(zhí)行func函數(shù)。p.close():關(guān)閉進(jìn)程池,防止進(jìn)一步操作。如果所有操作持續(xù)掛起,它們將在工作進(jìn)程終止前完成P.jion():等待所有工作進(jìn)程退出。此方法只能在close()或teminate()之后調(diào)用主要方法Pool主要方法 方法apply_async()和map_async()的返回值是AsyncResul的實(shí)例obj。實(shí)例具有以下方法:1、obj.get():返回結(jié)果,如果有必要?jiǎng)t等待結(jié)果到達(dá)。timeout是可選的。如果在指定時(shí)間內(nèi)還沒(méi)有到達(dá),將引發(fā)一場(chǎng)。如果遠(yuǎn)程操作中引發(fā)了異常,它將在調(diào)用此方法時(shí)再次被引發(fā)。 2、obj.ready():如果調(diào)用完成,返回True 3、obj.successful():如果調(diào)用完成且沒(méi)有引發(fā)異常,返回True,如果在結(jié)果就緒之前調(diào)用此方法,引發(fā)異常 4、obj.wait([timeout]):等待結(jié)果變?yōu)榭捎谩?5、obj.terminate():立即終止所有工作進(jìn)程,同時(shí)不執(zhí)行任何清理或結(jié)束任何掛起工作。如果p被垃圾回收,將自動(dòng)調(diào)用此函數(shù)其他方法(了解即可)

    代碼實(shí)例 ? ? ? ?

    進(jìn)程池和多進(jìn)程效率對(duì)比
    from multiprocessing import Pool,Process import time def func(i):i += 1print(i)if __name__ == '__main__':p = Pool(4)# 創(chuàng)建進(jìn)程池,池中有4個(gè)進(jìn)程待命start = time.time()t = [i for i in range(100)]p.map(func,t)#p.close()p.join()# 等待進(jìn)程池中所有進(jìn)程都執(zhí)行完所有任務(wù)。print(time.time() - start)# 打印進(jìn)程池做任務(wù)的時(shí)間start = time.time()l = []for i in range(100):p = Process(target=func,args=(i,))p.start()l.append(p)[i.join() for i in l]# 等待所有進(jìn)程工作結(jié)束print(time.time() - start)# 打印開(kāi)啟100個(gè)進(jìn)程做任務(wù)的時(shí)間print('--'*20+'>')map進(jìn)程池和多進(jìn)程做任務(wù)的效率對(duì)比

    ?進(jìn)程池的同步調(diào)用和異步調(diào)用

    from multiprocessing import Pool,Process import time,osdef func(i):i+= 1time.sleep(2)print(i,os.getpid())return i if __name__ == '__main__':p = Pool(5)# 創(chuàng)建進(jìn)程池,池中有5個(gè)進(jìn)程待命res_l = []for i in range(10):res = p.apply(func,args=(i,))# 有10個(gè)任務(wù)來(lái),交給進(jìn)程池中5個(gè)進(jìn)程,5個(gè)進(jìn)程同步執(zhí)行任務(wù)直到拿到resres_l.append(res)print(res_l)進(jìn)程池的同步調(diào)用 from multiprocessing import Pool,Process import time,osdef func(i):i+= 1time.sleep(2)print(i,os.getpid())return i if __name__ == '__main__':p = Pool(5)# 創(chuàng)建進(jìn)程池,池中有5個(gè)進(jìn)程待命res_l = []for i in range(10):res = p.apply_async(func,args=(i,))# 異步執(zhí)行10個(gè)任務(wù),每次最多5個(gè)進(jìn)程同時(shí)運(yùn)行res_l.append(res)# 拿到結(jié)果后是一個(gè)AsyncResul的實(shí)例obj,先將結(jié)果放入列表p.close()p.join()# 異步執(zhí)行需要join,也就是讓主進(jìn)程等待進(jìn)程池中所有進(jìn)程執(zhí)行完所有任務(wù),否則可能進(jìn)程池中的進(jìn)程還沒(méi)來(lái)得及執(zhí)行任務(wù),主進(jìn)程就結(jié)束了。for i in res_l:print(i.get())# 異步機(jī)制,從AsyncResul的實(shí)例obj中g(shù)et到實(shí)際結(jié)果,同步機(jī)制沒(méi)有此方法# 因?yàn)橥綑C(jī)制能直接拿到實(shí)際結(jié)果# 其實(shí)get是阻塞等待的,也就是說(shuō),如果沒(méi)有上邊的close和join :# 主進(jìn)程一樣會(huì)阻塞在get等待進(jìn)程池中給返回結(jié)果,進(jìn)程池異步執(zhí)行任務(wù)獲取結(jié)果# 每次有一個(gè)進(jìn)程返回結(jié)果后,就能get到一個(gè)結(jié)果,然后for循環(huán)到下一次繼續(xù)阻塞等待拿結(jié)果進(jìn)程池的異步調(diào)用

    ?練習(xí):進(jìn)程池實(shí)現(xiàn)socket并發(fā)聊天

    from multiprocessing import Pool import socketSOURCE_ADDR = ('127.0.0.1', 8090)def communication(conn):while 1:try:msg_r = conn.recv(1024).decode('utf-8')if not msg_r: breakprint(msg_r)conn.send(msg_r.upper().encode('utf-8'))except Exception: # 可能接收比如客戶端直接強(qiáng)制斷開(kāi)連接等錯(cuò)誤。print('結(jié)束')breakif __name__ == '__main__':p = Pool(4)sk = socket.socket()sk.bind(SOURCE_ADDR)sk.listen()while 1:conn, addr = sk.accept()p.apply_async(communication, args=(conn,))server端 import socketsk = socket.socket() SOURCE_ADDR = ('127.0.0.1',8090) sk.connect(SOURCE_ADDR)while 1:msg_s = input('>>>')if not msg_s:continuesk.send(msg_s.encode('utf-8'))print(sk.recv(1024).decode('utf-8'))client端

    ?上述代碼體現(xiàn)出:并發(fā)開(kāi)啟多個(gè)客戶端,服務(wù)端同一時(shí)間只能接收4個(gè)客戶端的請(qǐng)求,當(dāng)再有客戶端請(qǐng)求時(shí),需要等待,只能結(jié)束一個(gè)客戶端,另外一個(gè)客戶端才會(huì)進(jìn)來(lái).

    需要回調(diào)函數(shù)的場(chǎng)景:進(jìn)程池中任何一個(gè)任務(wù)一旦處理完了,就立即告知主進(jìn)程:我好了,你可以處理我的結(jié)果了。主進(jìn)程則調(diào)用一個(gè)函數(shù)去處理該結(jié)果,該函數(shù)即回調(diào)函數(shù)我們可以把耗時(shí)間(阻塞)的任務(wù)放到進(jìn)程池中,然后指定回調(diào)函數(shù)(主進(jìn)程負(fù)責(zé)執(zhí)行),這樣主進(jìn)程在執(zhí)行回調(diào)函數(shù)時(shí)就省去了I/O的過(guò)程,直接拿到的是任務(wù)的結(jié)果需要注意的是:在進(jìn)程池中,回調(diào)函數(shù)是由主函數(shù)調(diào)用的! import requests from multiprocessing import Pool,Process import time import os def get_url(url):while 1:r = requests.get(url)if r.status_code == 200:return url,r.textdef write_res(result):info = '%s : %s'%(result[0],result[1])with open('info.txt','a',encoding='utf-8') as f:f.write(info)# print('回調(diào)函數(shù)pid:%s'%(os.getpid()))if __name__ == '__main__':p = Pool(4)# print('主函數(shù)pid:%s'%(os.getpid()))urls = ['https://www.baidu.com','http://www.python.org','http://www.jd.com','http://www.taobao.com','http://www.mi.com','http://www.cnblogs.com']res_l = []for url in urls:res = p.apply_async(get_url,args=(url,),callback=write_res)res_l.append(res)p.close()p.join()for i in res_l:print(i.get()[0])使用進(jìn)程池請(qǐng)求多個(gè)url以減少網(wǎng)絡(luò)延遲等待 import requests import bs4 from multiprocessing import Poolheader = {'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0' }# 請(qǐng)求頭def get_img_url(url):'''獲取目標(biāo)網(wǎng)頁(yè)中,每個(gè)目的圖片的準(zhǔn)確地址'''img_url = []res = requests.get(url, headers=header)if res.status_code == 200:soup = bs4.BeautifulSoup(res.text, 'html.parser')img_addr = soup.find('div', class_='beauty_details_imgs_box').find_all('li')for i in img_addr:img = i.find('img').get('src')img_url.append(img)return img_urldef get_img(img_url):'''進(jìn)程池異步請(qǐng)求 每個(gè)目的圖片的準(zhǔn)確地址'''res = requests.get(img_url)if res.status_code == 200:return res, img_urldef save_img(img_url):'''回調(diào)函數(shù),每有一個(gè)進(jìn)程獲取到圖片地址后,將圖片寫(xiě)入本地'''res, img = img_url[0], img_url[1]with open(img.split('/')[-1].split('_')[0], 'wb') as f:f.write(res.content)if __name__ == '__main__':url = 'http://www.xiao4j.com/beauty/photos/30687.html'p = Pool(4)img_addr = get_img_url(url)for img in img_addr:p.apply_async(get_img, args=(img,), callback=save_img)p.close()p.join()爬妹子 爬妹子

    ?在進(jìn)程池中,如果對(duì)于每個(gè)進(jìn)程返回的結(jié)果并不需要及時(shí)處理,需要等待所有結(jié)果完成后再統(tǒng)一處理的話,就無(wú)需回調(diào)函數(shù)了。

    def func(num):sum = 0for i in range(num):sum += ireturn sumif __name__ == '__main__':p = Pool(4)res = []for i in range(20):r = p.apply_async(func,args=(i,))res.append(r)p.close()p.join()[print(i.get()) for i in res]不需要用回調(diào)函數(shù)

    進(jìn)程池的其他實(shí)現(xiàn)方式:https://docs.python.org/dev/library/concurrent.futures.html

    ?

    參考資料:

    http://www.cnblogs.com/linhaifeng/articles/6817679.html

    http://www.cnblogs.com/Eva-J/articles/8253549.html

    https://www.jianshu.com/p/1200fd49b583

    ?

    轉(zhuǎn)載于:https://www.cnblogs.com/zhaoyang110/p/9508273.html

    總結(jié)

    以上是生活随笔為你收集整理的python之路-进程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

    久久久精品成人免费观看 | 国产精品va在线观看无码 | 77777熟女视频在线观看 а天堂中文在线官网 | 好屌草这里只有精品 | 亚洲熟悉妇女xxx妇女av | 激情内射日本一区二区三区 | 色婷婷综合中文久久一本 | 一个人看的视频www在线 | 国产精品18久久久久久麻辣 | 粉嫩少妇内射浓精videos | 久久久久免费看成人影片 | 国产午夜视频在线观看 | 精品aⅴ一区二区三区 | 又紧又大又爽精品一区二区 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 色爱情人网站 | 久久久久久国产精品无码下载 | 精品国产国产综合精品 | 欧美肥老太牲交大战 | 丰满人妻一区二区三区免费视频 | 亚洲欧美国产精品专区久久 | a国产一区二区免费入口 | 一本精品99久久精品77 | 色噜噜亚洲男人的天堂 | 欧美真人作爱免费视频 | 人妻有码中文字幕在线 | 国产97人人超碰caoprom | 强伦人妻一区二区三区视频18 | 两性色午夜视频免费播放 | 无遮无挡爽爽免费视频 | 久久精品中文闷骚内射 | 成人试看120秒体验区 | 国产人妻精品一区二区三区不卡 | 成 人 免费观看网站 | 夫妻免费无码v看片 | 国产精品亚洲lv粉色 | 国产激情无码一区二区app | 免费国产黄网站在线观看 | 鲁鲁鲁爽爽爽在线视频观看 | 中文字幕乱码亚洲无线三区 | 精品欧洲av无码一区二区三区 | 亚洲s色大片在线观看 | 国产精品久久久久无码av色戒 | 国语精品一区二区三区 | 国产一精品一av一免费 | 久久精品一区二区三区四区 | 亚洲午夜福利在线观看 | a片免费视频在线观看 | 免费播放一区二区三区 | 西西人体www44rt大胆高清 | 丝袜人妻一区二区三区 | 久久婷婷五月综合色国产香蕉 | 亚洲色欲久久久综合网东京热 | 国产欧美亚洲精品a | 亚洲aⅴ无码成人网站国产app | 国产成人无码a区在线观看视频app | 装睡被陌生人摸出水好爽 | 欧美日韩精品 | 乱中年女人伦av三区 | 波多野结衣av一区二区全免费观看 | 亚洲人交乣女bbw | 捆绑白丝粉色jk震动捧喷白浆 | 丰满肥臀大屁股熟妇激情视频 | 天天拍夜夜添久久精品 | 亚洲区欧美区综合区自拍区 | 国产成人综合在线女婷五月99播放 | 无码av中文字幕免费放 | 精品无码成人片一区二区98 | 最近免费中文字幕中文高清百度 | 久久精品国产99久久6动漫 | 成人欧美一区二区三区 | 人人妻人人澡人人爽精品欧美 | 国产偷国产偷精品高清尤物 | 红桃av一区二区三区在线无码av | 成人无码视频免费播放 | 亚洲 另类 在线 欧美 制服 | 国产国产精品人在线视 | 一区二区三区高清视频一 | 日韩 欧美 动漫 国产 制服 | 国产精品久免费的黄网站 | 成年女人永久免费看片 | 国产精品理论片在线观看 | 亚洲精品午夜国产va久久成人 | 88国产精品欧美一区二区三区 | 性做久久久久久久免费看 | 成 人影片 免费观看 | 国产97色在线 | 免 | 日日摸夜夜摸狠狠摸婷婷 | 大屁股大乳丰满人妻 | 国产熟女一区二区三区四区五区 | 亚洲s色大片在线观看 | 国精品人妻无码一区二区三区蜜柚 | 玩弄中年熟妇正在播放 | 牲交欧美兽交欧美 | 又大又黄又粗又爽的免费视频 | 成人无码影片精品久久久 | 四虎国产精品一区二区 | 免费人成网站视频在线观看 | 午夜性刺激在线视频免费 | 熟女少妇在线视频播放 | 久久久婷婷五月亚洲97号色 | 亚洲狠狠婷婷综合久久 | 久久精品国产精品国产精品污 | 国产真人无遮挡作爱免费视频 | 国产艳妇av在线观看果冻传媒 | 欧美国产亚洲日韩在线二区 | 未满成年国产在线观看 | 国产成人午夜福利在线播放 | 丁香啪啪综合成人亚洲 | 国产后入清纯学生妹 | 一本久久a久久精品亚洲 | 国产人妻人伦精品1国产丝袜 | 55夜色66夜色国产精品视频 | 精品一二三区久久aaa片 | 国产激情一区二区三区 | 国产真人无遮挡作爱免费视频 | 大色综合色综合网站 | 亚洲成av人片天堂网无码】 | 国产精品沙发午睡系列 | 熟女少妇人妻中文字幕 | 国产人妻精品一区二区三区不卡 | aⅴ亚洲 日韩 色 图网站 播放 | 成年美女黄网站色大免费视频 | 日本熟妇人妻xxxxx人hd | 国产av一区二区三区最新精品 | 波多野结衣一区二区三区av免费 | 久久精品国产日本波多野结衣 | 亚洲综合色区中文字幕 | 国产精品久久久久影院嫩草 | 老子影院午夜精品无码 | 亚洲成a人片在线观看无码3d | 麻花豆传媒剧国产免费mv在线 | 亚洲国产精品久久久天堂 | 天堂а√在线地址中文在线 | 久久久久久久久888 | 亚洲色欲色欲天天天www | 国产精品成人av在线观看 | 国产精品资源一区二区 | 亚洲国产av精品一区二区蜜芽 | 国内揄拍国内精品少妇国语 | 波多野结衣 黑人 | 在线精品国产一区二区三区 | 欧美人与动性行为视频 | 亚洲人成网站色7799 | 人人妻人人澡人人爽精品欧美 | 97久久国产亚洲精品超碰热 | 久久久久av无码免费网 | 国产日产欧产精品精品app | 国产精品va在线观看无码 | 欧美熟妇另类久久久久久多毛 | 日本一卡2卡3卡四卡精品网站 | 嫩b人妻精品一区二区三区 | 精品成人av一区二区三区 | 日韩视频 中文字幕 视频一区 | 无遮挡啪啪摇乳动态图 | 无套内谢老熟女 | 中文字幕无码免费久久99 | 99精品视频在线观看免费 | 亚洲人成网站在线播放942 | 东京热一精品无码av | 人妻插b视频一区二区三区 | 亚洲の无码国产の无码影院 | 草草网站影院白丝内射 | 久久午夜夜伦鲁鲁片无码免费 | 国产办公室秘书无码精品99 | 免费无码午夜福利片69 | 欧美精品在线观看 | 亚洲欧洲中文日韩av乱码 | 亚拍精品一区二区三区探花 | 欧美精品无码一区二区三区 | 亚洲精品久久久久avwww潮水 | 天堂а√在线地址中文在线 | 国产精品亚洲专区无码不卡 | 伊人久久大香线蕉av一区二区 | 欧美变态另类xxxx | 熟妇激情内射com | 日本一区二区三区免费高清 | 色婷婷香蕉在线一区二区 | 好男人www社区 | 无码帝国www无码专区色综合 | 亚洲经典千人经典日产 | 欧美日韩一区二区免费视频 | 亚洲色偷偷偷综合网 | 蜜桃视频韩日免费播放 | 乌克兰少妇xxxx做受 | 伊在人天堂亚洲香蕉精品区 | 国产一区二区三区影院 | 麻豆蜜桃av蜜臀av色欲av | 亚洲gv猛男gv无码男同 | 亚洲熟悉妇女xxx妇女av | 亚洲精品一区二区三区在线观看 | 性色欲网站人妻丰满中文久久不卡 | 国产精品鲁鲁鲁 | 久久综合给久久狠狠97色 | aⅴ在线视频男人的天堂 | 欧美黑人乱大交 | 国产真实乱对白精彩久久 | 无码人妻精品一区二区三区下载 | 亚洲国产精品无码一区二区三区 | 亚洲熟妇色xxxxx欧美老妇y | 荫蒂被男人添的好舒服爽免费视频 | 无码国模国产在线观看 | 国产精品国产自线拍免费软件 | 日日天干夜夜狠狠爱 | 丁香花在线影院观看在线播放 | 丰满岳乱妇在线观看中字无码 | 97精品人妻一区二区三区香蕉 | 欧美性生交xxxxx久久久 | 亚洲理论电影在线观看 | 麻豆精产国品 | 国产成人精品视频ⅴa片软件竹菊 | 国内少妇偷人精品视频免费 | 久久精品国产一区二区三区肥胖 | 理论片87福利理论电影 | 亚洲色大成网站www | 久久aⅴ免费观看 | 亚洲の无码国产の无码影院 | 久久国语露脸国产精品电影 | 国产亚洲人成在线播放 | 亚洲aⅴ无码成人网站国产app | 又大又紧又粉嫩18p少妇 | 中文字幕无码日韩欧毛 | 国产超级va在线观看视频 | 国产精品久久久一区二区三区 | 国产成人一区二区三区别 | 欧洲熟妇色 欧美 | 一二三四社区在线中文视频 | 国产在线aaa片一区二区99 | 欧美怡红院免费全部视频 | 荫蒂被男人添的好舒服爽免费视频 | 精品 日韩 国产 欧美 视频 | 图片区 小说区 区 亚洲五月 | 超碰97人人做人人爱少妇 | 桃花色综合影院 | 欧美人与善在线com | 性生交片免费无码看人 | 欧美35页视频在线观看 | 亚洲精品一区二区三区四区五区 | 亚洲国产欧美日韩精品一区二区三区 | 天堂无码人妻精品一区二区三区 | 久久精品国产精品国产精品污 | 色情久久久av熟女人妻网站 | 欧美老熟妇乱xxxxx | 2019nv天堂香蕉在线观看 | 久久久久久久人妻无码中文字幕爆 | 少妇被黑人到高潮喷出白浆 | 免费视频欧美无人区码 | 中文字幕亚洲情99在线 | 在线亚洲高清揄拍自拍一品区 | 久久综合九色综合欧美狠狠 | 国产精品亚洲综合色区韩国 | 激情爆乳一区二区三区 | 日韩精品成人一区二区三区 | 学生妹亚洲一区二区 | 丁香啪啪综合成人亚洲 | 六月丁香婷婷色狠狠久久 | 色欲av亚洲一区无码少妇 | 国产精品人人妻人人爽 | 丰满人妻翻云覆雨呻吟视频 | 麻豆国产97在线 | 欧洲 | 精品国产精品久久一区免费式 | 国产高潮视频在线观看 | 伊人久久大香线蕉亚洲 | 99久久久无码国产aaa精品 | 永久黄网站色视频免费直播 | 精品国产青草久久久久福利 | 天堂久久天堂av色综合 | 中文无码伦av中文字幕 | 国产精品嫩草久久久久 | 亚洲精品综合一区二区三区在线 | 又大又黄又粗又爽的免费视频 | 国产人妻久久精品二区三区老狼 | 在教室伦流澡到高潮hnp视频 | 亚洲国产成人av在线观看 | 欧美成人午夜精品久久久 | 成年美女黄网站色大免费全看 | 亚洲码国产精品高潮在线 | 一区二区传媒有限公司 | 精品久久久中文字幕人妻 | 中文字幕乱码人妻二区三区 | 又湿又紧又大又爽a视频国产 | 最近中文2019字幕第二页 | 国产精品福利视频导航 | 亚洲熟妇色xxxxx欧美老妇y | 极品嫩模高潮叫床 | 中文字幕久久久久人妻 | 377p欧洲日本亚洲大胆 | 精品久久综合1区2区3区激情 | 东京一本一道一二三区 | 久久精品成人欧美大片 | 国产午夜精品一区二区三区嫩草 | 亚洲欧美日韩国产精品一区二区 | 国产特级毛片aaaaaaa高清 | 熟妇人妻激情偷爽文 | 亚洲精品一区二区三区大桥未久 | 天天拍夜夜添久久精品大 | 日韩视频 中文字幕 视频一区 | 亚洲色偷偷偷综合网 | 久久99国产综合精品 | 精品国产一区av天美传媒 | 无套内射视频囯产 | 97夜夜澡人人爽人人喊中国片 | 野狼第一精品社区 | 精品欧美一区二区三区久久久 | 亚洲一区二区三区四区 | av无码不卡在线观看免费 | 国产亚av手机在线观看 | 国产精品久久久久7777 | 波多野结衣高清一区二区三区 | 色五月五月丁香亚洲综合网 | 好男人www社区 | 少妇性l交大片欧洲热妇乱xxx | 日韩精品乱码av一区二区 | 乱码av麻豆丝袜熟女系列 | 成年美女黄网站色大免费视频 | 久久国产精品萌白酱免费 | 日本一卡二卡不卡视频查询 | 亚洲精品综合五月久久小说 | 18黄暴禁片在线观看 | 日本精品久久久久中文字幕 | 98国产精品综合一区二区三区 | 青草青草久热国产精品 | 日日碰狠狠躁久久躁蜜桃 | 亚洲国产精品久久人人爱 | 在线 国产 欧美 亚洲 天堂 | 色妞www精品免费视频 | 三上悠亚人妻中文字幕在线 | aa片在线观看视频在线播放 | 亚洲娇小与黑人巨大交 | 国内精品九九久久久精品 | 激情人妻另类人妻伦 | 激情爆乳一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 99久久久国产精品无码免费 | 国产手机在线αⅴ片无码观看 | 久久国产精品_国产精品 | 国产人妻久久精品二区三区老狼 | 日韩精品无码一区二区中文字幕 | 久久久久久九九精品久 | 国产又爽又猛又粗的视频a片 | 黑人巨大精品欧美一区二区 | 亚洲日韩中文字幕在线播放 | 国产人妻人伦精品1国产丝袜 | 婷婷综合久久中文字幕蜜桃三电影 | 丝袜美腿亚洲一区二区 | 久久精品国产亚洲精品 | 我要看www免费看插插视频 | 亚洲第一无码av无码专区 | 国产sm调教视频在线观看 | 亚洲欧洲日本无在线码 | 日本一区二区三区免费高清 | 国产97在线 | 亚洲 | 中文字幕+乱码+中文字幕一区 | 婷婷五月综合激情中文字幕 | www国产亚洲精品久久久日本 | 婷婷五月综合缴情在线视频 | 久久精品一区二区三区四区 | 女人高潮内射99精品 | 亚洲一区二区三区在线观看网站 | 成人一区二区免费视频 | 性色av无码免费一区二区三区 | 国产人妻大战黑人第1集 | 久久久久免费看成人影片 | 亚洲一区二区三区播放 | 精品国产一区二区三区av 性色 | 亚洲熟悉妇女xxx妇女av | 1000部啪啪未满十八勿入下载 | 免费乱码人妻系列无码专区 | 久久久久久av无码免费看大片 | 日韩精品一区二区av在线 | 亚洲色欲色欲欲www在线 | 成人欧美一区二区三区黑人 | 欧美激情综合亚洲一二区 | 激情国产av做激情国产爱 | ass日本丰满熟妇pics | 草草网站影院白丝内射 | 中文字幕乱码人妻无码久久 | 日本熟妇乱子伦xxxx | 天下第一社区视频www日本 | 亚洲综合久久一区二区 | 欧美变态另类xxxx | 少妇被粗大的猛进出69影院 | 亚洲欧洲中文日韩av乱码 | 午夜性刺激在线视频免费 | 久久人人爽人人人人片 | 国产sm调教视频在线观看 | 一个人看的视频www在线 | 麻豆国产人妻欲求不满谁演的 | 精品无码国产一区二区三区av | 少妇厨房愉情理9仑片视频 | 又粗又大又硬又长又爽 | 亚洲精品一区国产 | 亚洲色在线无码国产精品不卡 | 少妇性荡欲午夜性开放视频剧场 | 亚洲呦女专区 | 国产无遮挡又黄又爽免费视频 | 青草青草久热国产精品 | 亚洲人成人无码网www国产 | 乱中年女人伦av三区 | 国产精品高潮呻吟av久久 | 骚片av蜜桃精品一区 | 亚洲の无码国产の无码影院 | 综合人妻久久一区二区精品 | 亚洲欧美日韩综合久久久 | 久久久av男人的天堂 | 久久99精品国产麻豆 | 国产尤物精品视频 | 少女韩国电视剧在线观看完整 | 亚洲日本va午夜在线电影 | 天天拍夜夜添久久精品 | 精品国产一区二区三区四区 | 日本熟妇乱子伦xxxx | 中文毛片无遮挡高清免费 | 亚洲精品一区二区三区在线观看 | 久久久无码中文字幕久... | 久久亚洲精品中文字幕无男同 | 国产亚洲美女精品久久久2020 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 色欲av亚洲一区无码少妇 | 日本在线高清不卡免费播放 | 欧洲美熟女乱又伦 | 欧美 亚洲 国产 另类 | 亚洲中文字幕无码中文字在线 | 天堂久久天堂av色综合 | 国产精品美女久久久久av爽李琼 | 婷婷五月综合激情中文字幕 | 亚洲熟悉妇女xxx妇女av | a国产一区二区免费入口 | 97久久国产亚洲精品超碰热 | 色情久久久av熟女人妻网站 | 欧洲熟妇色 欧美 | 少妇太爽了在线观看 | 无码毛片视频一区二区本码 | 中文字幕无码免费久久9一区9 | 国产av人人夜夜澡人人爽麻豆 | 2019nv天堂香蕉在线观看 | 乱人伦人妻中文字幕无码 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久人人97超碰a片精品 | 亚洲精品成a人在线观看 | 亚洲日韩精品欧美一区二区 | 人人妻人人藻人人爽欧美一区 | 亚洲中文字幕无码中字 | 久久综合九色综合欧美狠狠 | 内射爽无广熟女亚洲 | 中文字幕亚洲情99在线 | 最近免费中文字幕中文高清百度 | 国产精品第一区揄拍无码 | 国产午夜无码精品免费看 | 亚洲成a人片在线观看无码 | 日本精品高清一区二区 | 国产精品久久久午夜夜伦鲁鲁 | 国产成人综合在线女婷五月99播放 | 麻豆果冻传媒2021精品传媒一区下载 | 精品一区二区三区无码免费视频 | 欧美老熟妇乱xxxxx | 国产绳艺sm调教室论坛 | 国产亚洲日韩欧美另类第八页 | 成人精品一区二区三区中文字幕 | 精品国产av色一区二区深夜久久 | 男女性色大片免费网站 | 无套内谢老熟女 | 亚洲国产日韩a在线播放 | 老熟女乱子伦 | 久久国内精品自在自线 | 久久久久久九九精品久 | 亚洲色偷偷男人的天堂 | 一本色道久久综合亚洲精品不卡 | 久久久久成人片免费观看蜜芽 | 国产后入清纯学生妹 | 少妇高潮一区二区三区99 | 领导边摸边吃奶边做爽在线观看 | 欧美性猛交内射兽交老熟妇 | 亚洲娇小与黑人巨大交 | 亚洲日韩精品欧美一区二区 | 亚洲综合精品香蕉久久网 | 少妇无码一区二区二三区 | 伊人久久大香线焦av综合影院 | 无码福利日韩神码福利片 | 国产av一区二区三区最新精品 | 亚洲日本一区二区三区在线 | 日本一区二区更新不卡 | 国产av一区二区三区最新精品 | 国产综合久久久久鬼色 | 国产一区二区三区精品视频 | 蜜桃无码一区二区三区 | 日日摸夜夜摸狠狠摸婷婷 | 日本在线高清不卡免费播放 | 少妇人妻大乳在线视频 | 国产精品无码一区二区桃花视频 | 国产精品无码成人午夜电影 | 国产猛烈高潮尖叫视频免费 | 亚洲乱码国产乱码精品精 | 亚洲熟女一区二区三区 | 国产特级毛片aaaaaa高潮流水 | 无码人妻av免费一区二区三区 | 国产av久久久久精东av | 国产卡一卡二卡三 | 国产在线无码精品电影网 | 国产综合色产在线精品 | 一本久久伊人热热精品中文字幕 | 亚洲精品一区二区三区四区五区 | 国产人妻精品一区二区三区不卡 | 人妻天天爽夜夜爽一区二区 | 国产午夜视频在线观看 | 中文字幕乱妇无码av在线 | 噜噜噜亚洲色成人网站 | 人妻无码久久精品人妻 | 蜜桃无码一区二区三区 | 乱人伦人妻中文字幕无码久久网 | 女人被男人躁得好爽免费视频 | 永久免费观看美女裸体的网站 | 少妇高潮喷潮久久久影院 | 亚洲大尺度无码无码专区 | 成人毛片一区二区 | 亚洲另类伦春色综合小说 | 国产熟女一区二区三区四区五区 | 国产黑色丝袜在线播放 | 国内丰满熟女出轨videos | 日本一区二区三区免费高清 | 黄网在线观看免费网站 | 高潮喷水的毛片 | 日日麻批免费40分钟无码 | 亚洲色www成人永久网址 | 国产福利视频一区二区 | 草草网站影院白丝内射 | 丝袜人妻一区二区三区 | 久久久www成人免费毛片 | 沈阳熟女露脸对白视频 | 国产精品久久久久久亚洲毛片 | 免费人成在线视频无码 | 亚洲爆乳大丰满无码专区 | 一区二区三区乱码在线 | 欧洲 | 国产黑色丝袜在线播放 | 亚洲第一无码av无码专区 | 中文字幕无码av激情不卡 | 麻豆av传媒蜜桃天美传媒 | 激情内射日本一区二区三区 | 久久亚洲日韩精品一区二区三区 | 无码国内精品人妻少妇 | 99精品久久毛片a片 | 欧美 丝袜 自拍 制服 另类 | 无人区乱码一区二区三区 | 国产精品嫩草久久久久 | 久久99精品久久久久久 | 初尝人妻少妇中文字幕 | 图片区 小说区 区 亚洲五月 | 国产九九九九九九九a片 | 亚洲小说春色综合另类 | 人妻无码久久精品人妻 | 巨爆乳无码视频在线观看 | 亚欧洲精品在线视频免费观看 | 亚洲午夜无码久久 | 国产艳妇av在线观看果冻传媒 | 永久免费观看美女裸体的网站 | 日本大香伊一区二区三区 | 国产99久久精品一区二区 | 亚洲 a v无 码免 费 成 人 a v | 蜜臀aⅴ国产精品久久久国产老师 | 高潮毛片无遮挡高清免费视频 | 2020久久香蕉国产线看观看 | 亚欧洲精品在线视频免费观看 | 亚洲人成无码网www | 四虎永久在线精品免费网址 | 国内老熟妇对白xxxxhd | 精品国产av色一区二区深夜久久 | 暴力强奷在线播放无码 | 久久精品国产99久久6动漫 | 无码人妻黑人中文字幕 | 国产极品美女高潮无套在线观看 | 精品无码国产一区二区三区av | 精品成在人线av无码免费看 | 国产av人人夜夜澡人人爽麻豆 | 国产欧美精品一区二区三区 | 欧美成人午夜精品久久久 | 亚洲国产一区二区三区在线观看 | 国产亚洲美女精品久久久2020 | 老太婆性杂交欧美肥老太 | 男人的天堂av网站 | 高清无码午夜福利视频 | 蜜臀av无码人妻精品 | 奇米影视7777久久精品 | 亚洲国产精品无码一区二区三区 | 亚洲热妇无码av在线播放 | 永久免费观看美女裸体的网站 | 精品一区二区不卡无码av | 少妇人妻大乳在线视频 | 午夜无码人妻av大片色欲 | 中国女人内谢69xxxxxa片 | 亚洲国产精品一区二区第一页 | 扒开双腿疯狂进出爽爽爽视频 | 久久精品99久久香蕉国产色戒 | 88国产精品欧美一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 小泽玛莉亚一区二区视频在线 | 国产人妻精品午夜福利免费 | 男女下面进入的视频免费午夜 | 亚洲人成影院在线观看 | 西西人体www44rt大胆高清 | 性色欲网站人妻丰满中文久久不卡 | 四虎永久在线精品免费网址 | 精品一区二区三区波多野结衣 | 午夜嘿嘿嘿影院 | 搡女人真爽免费视频大全 | 国产精品久免费的黄网站 | 亚洲爆乳无码专区 | 波多野42部无码喷潮在线 | 亚洲国产精品久久人人爱 | 奇米影视888欧美在线观看 | 国产九九九九九九九a片 | 国产成人无码一二三区视频 | 九九久久精品国产免费看小说 | 中文久久乱码一区二区 | 精品欧美一区二区三区久久久 | 97精品人妻一区二区三区香蕉 | 小sao货水好多真紧h无码视频 | 精品无码国产一区二区三区av | 亚洲中文字幕在线无码一区二区 | 人人超人人超碰超国产 | 人妻无码久久精品人妻 | 男人扒开女人内裤强吻桶进去 | 欧美老妇交乱视频在线观看 | 成 人 网 站国产免费观看 | 国产色在线 | 国产 | 无遮无挡爽爽免费视频 | 国产精品欧美成人 | 亚洲精品久久久久中文第一幕 | 日本一卡2卡3卡四卡精品网站 | 成人精品天堂一区二区三区 | 精品偷拍一区二区三区在线看 | 国产高清av在线播放 | 亚洲一区二区三区香蕉 | 欧美激情一区二区三区成人 | 国产午夜亚洲精品不卡 | 国产精品成人av在线观看 | 精品少妇爆乳无码av无码专区 | 亚洲男女内射在线播放 | 乌克兰少妇性做爰 | 久久99精品国产.久久久久 | 午夜时刻免费入口 | 午夜福利试看120秒体验区 | 国产午夜手机精彩视频 | 丰满人妻精品国产99aⅴ | 真人与拘做受免费视频一 | 偷窥村妇洗澡毛毛多 | 任你躁在线精品免费 | 波多野结衣 黑人 | 亚洲精品国偷拍自产在线麻豆 | 两性色午夜视频免费播放 | 久久 国产 尿 小便 嘘嘘 | 麻花豆传媒剧国产免费mv在线 | 捆绑白丝粉色jk震动捧喷白浆 | 国产另类ts人妖一区二区 | 377p欧洲日本亚洲大胆 | 人人妻人人澡人人爽欧美精品 | 天海翼激烈高潮到腰振不止 | 丰满少妇人妻久久久久久 | 欧美第一黄网免费网站 | 丰满妇女强制高潮18xxxx | 国产极品视觉盛宴 | а√天堂www在线天堂小说 | 一个人看的www免费视频在线观看 | 成熟人妻av无码专区 | 日本免费一区二区三区最新 | 精品国偷自产在线 | 一本久久伊人热热精品中文字幕 | 精品欧洲av无码一区二区三区 | 999久久久国产精品消防器材 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 十八禁真人啪啪免费网站 | 欧美黑人巨大xxxxx | 精品无码成人片一区二区98 | 人人爽人人澡人人高潮 | 大胆欧美熟妇xx | 2019nv天堂香蕉在线观看 | 噜噜噜亚洲色成人网站 | 中文字幕乱码人妻无码久久 | 精品久久久无码人妻字幂 | 国产精品无码一区二区三区不卡 | 一本色道婷婷久久欧美 | 成人亚洲精品久久久久软件 | 熟女少妇在线视频播放 | 精品日本一区二区三区在线观看 | 免费乱码人妻系列无码专区 | 两性色午夜免费视频 | 极品尤物被啪到呻吟喷水 | 欧美自拍另类欧美综合图片区 | 97夜夜澡人人爽人人喊中国片 | 熟妇激情内射com | 伊人久久婷婷五月综合97色 | 在线а√天堂中文官网 | 国产高潮视频在线观看 | 无码人妻精品一区二区三区不卡 | 中文无码精品a∨在线观看不卡 | 无码国产激情在线观看 | 天堂一区人妻无码 | 国产av一区二区三区最新精品 | 无码人妻精品一区二区三区下载 | 色欲综合久久中文字幕网 | 成年美女黄网站色大免费视频 | 成人精品视频一区二区 | 成人欧美一区二区三区 | 无码av最新清无码专区吞精 | 亚洲欧美综合区丁香五月小说 | 婷婷色婷婷开心五月四房播播 | 真人与拘做受免费视频一 | 国产真实乱对白精彩久久 | 97久久超碰中文字幕 | 波多野结衣乳巨码无在线观看 | 欧美喷潮久久久xxxxx | 亚洲精品鲁一鲁一区二区三区 | 国产香蕉尹人视频在线 | 熟妇人妻中文av无码 | 大乳丰满人妻中文字幕日本 | 中文字幕无码免费久久9一区9 | 亚洲人成网站色7799 | 18禁止看的免费污网站 | 少妇被粗大的猛进出69影院 | 4hu四虎永久在线观看 | 色婷婷av一区二区三区之红樱桃 | 国产精品18久久久久久麻辣 | 中文无码精品a∨在线观看不卡 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲男人av天堂午夜在 | 18禁黄网站男男禁片免费观看 | 国产三级精品三级男人的天堂 | 国产黑色丝袜在线播放 | 午夜福利不卡在线视频 | 日本xxxx色视频在线观看免费 | 亚洲 高清 成人 动漫 | 国产亚av手机在线观看 | 欧美乱妇无乱码大黄a片 | 亚洲精品鲁一鲁一区二区三区 | 亚洲人成人无码网www国产 | 午夜丰满少妇性开放视频 | 婷婷丁香六月激情综合啪 | 久久99精品久久久久久动态图 | 久久久久成人片免费观看蜜芽 | 欧美精品在线观看 | 97精品人妻一区二区三区香蕉 | 波多野结衣av一区二区全免费观看 | а√资源新版在线天堂 | 国产激情精品一区二区三区 | 男女超爽视频免费播放 | 色偷偷人人澡人人爽人人模 | 久久www免费人成人片 | 亚洲 激情 小说 另类 欧美 | 国产三级精品三级男人的天堂 | 国产午夜亚洲精品不卡下载 | 丝袜人妻一区二区三区 | 久久婷婷五月综合色国产香蕉 | 99精品国产综合久久久久五月天 | 国产成人无码a区在线观看视频app | 欧美日本免费一区二区三区 | 男女性色大片免费网站 | 亚洲中文字幕乱码av波多ji | 精品国产成人一区二区三区 | 国产乱人偷精品人妻a片 | 国产av一区二区三区最新精品 | 久久综合狠狠综合久久综合88 | 国产精品久久久久久久9999 | 亚洲男人av香蕉爽爽爽爽 | 国产精品手机免费 | 色一情一乱一伦 | 欧美成人午夜精品久久久 | 亚洲成av人片在线观看无码不卡 | 成人毛片一区二区 | 任你躁国产自任一区二区三区 | 久久综合给合久久狠狠狠97色 | 熟女少妇在线视频播放 | 精品人妻中文字幕有码在线 | 亚洲综合无码久久精品综合 | 日韩人妻无码中文字幕视频 | 少女韩国电视剧在线观看完整 | 99精品国产综合久久久久五月天 | 高清不卡一区二区三区 | 亚洲欧洲无卡二区视頻 | 亚洲人成网站免费播放 | 成在人线av无码免观看麻豆 | 精品国产国产综合精品 | 国产成人综合在线女婷五月99播放 | 在线a亚洲视频播放在线观看 | aa片在线观看视频在线播放 | 国产精品内射视频免费 | 99久久久无码国产aaa精品 | 18禁黄网站男男禁片免费观看 | 国产一区二区三区四区五区加勒比 | 亚洲色无码一区二区三区 | 国产偷自视频区视频 | 久久久精品成人免费观看 | 天天拍夜夜添久久精品大 | 婷婷综合久久中文字幕蜜桃三电影 | 无码国模国产在线观看 | 亚洲人亚洲人成电影网站色 | 无码人妻少妇伦在线电影 | 成年女人永久免费看片 | 精品国产麻豆免费人成网站 | 久久99精品国产.久久久久 | 亚洲国产av精品一区二区蜜芽 | 伊人久久大香线蕉亚洲 | 性色欲情网站iwww九文堂 | 99久久精品午夜一区二区 | 国产精品亚洲综合色区韩国 | 99久久久无码国产精品免费 | 婷婷五月综合缴情在线视频 | 人人妻人人澡人人爽人人精品 | 老子影院午夜精品无码 | 丝袜足控一区二区三区 | 国产热a欧美热a在线视频 | 欧美日韩一区二区综合 | 久久成人a毛片免费观看网站 | 亚洲经典千人经典日产 | 亚洲自偷自偷在线制服 | 丰满少妇熟乱xxxxx视频 | 亚洲毛片av日韩av无码 | 永久免费观看国产裸体美女 | 999久久久国产精品消防器材 | 国产xxx69麻豆国语对白 | 亚无码乱人伦一区二区 | 亚拍精品一区二区三区探花 | 97精品国产97久久久久久免费 | 娇妻被黑人粗大高潮白浆 | 少妇的肉体aa片免费 | 免费看少妇作爱视频 | 精品人妻中文字幕有码在线 | 性色欲情网站iwww九文堂 | 亚洲一区二区三区含羞草 | 激情国产av做激情国产爱 | 狠狠色欧美亚洲狠狠色www | 最近免费中文字幕中文高清百度 | 成人aaa片一区国产精品 | 乱人伦人妻中文字幕无码 | 无码人妻精品一区二区三区下载 | 无码中文字幕色专区 | 狂野欧美激情性xxxx | 国产午夜亚洲精品不卡下载 | 中文无码伦av中文字幕 | 国色天香社区在线视频 | 国产av剧情md精品麻豆 | 天天拍夜夜添久久精品大 | 人妻与老人中文字幕 | 亚洲熟妇色xxxxx欧美老妇 | 国产免费无码一区二区视频 | 精品日本一区二区三区在线观看 | 国产一区二区三区四区五区加勒比 | 国产婷婷色一区二区三区在线 | 欧美大屁股xxxxhd黑色 | 国产日产欧产精品精品app | 免费网站看v片在线18禁无码 | 久久五月精品中文字幕 | 无码免费一区二区三区 | 亚洲精品美女久久久久久久 | 国产成人综合在线女婷五月99播放 | 国产亚洲日韩欧美另类第八页 | 色婷婷久久一区二区三区麻豆 | 亚洲熟妇色xxxxx欧美老妇 | 国产一区二区三区精品视频 | 亚洲gv猛男gv无码男同 | 大肉大捧一进一出视频出来呀 | 国产人妻久久精品二区三区老狼 | 亚洲欧美日韩国产精品一区二区 | 欧美日韩综合一区二区三区 | 亚洲色欲色欲天天天www | 久久久婷婷五月亚洲97号色 | 狠狠色欧美亚洲狠狠色www | 日韩人妻系列无码专区 | 久久久久免费看成人影片 | 日本爽爽爽爽爽爽在线观看免 | 婷婷五月综合缴情在线视频 | 久久99精品国产麻豆 | 亚洲va欧美va天堂v国产综合 | 国产精品久久久久7777 | 国产精品久久久久久亚洲影视内衣 | 国产电影无码午夜在线播放 | 欧美精品一区二区精品久久 | 在线精品国产一区二区三区 | 成人一在线视频日韩国产 | 亚洲成a人片在线观看无码3d | 久久无码人妻影院 | 国产在热线精品视频 | 国产偷国产偷精品高清尤物 | 国产在热线精品视频 | 影音先锋中文字幕无码 | 久久久久久九九精品久 | 国产精品亚洲专区无码不卡 | 欧美亚洲国产一区二区三区 | 国产情侣作爱视频免费观看 | 好爽又高潮了毛片免费下载 | 国产精品无码永久免费888 | 国产欧美熟妇另类久久久 | 国产女主播喷水视频在线观看 | 麻豆果冻传媒2021精品传媒一区下载 | 日韩人妻无码中文字幕视频 | 国产午夜视频在线观看 | 无码人妻久久一区二区三区不卡 | 国产综合久久久久鬼色 | 在线天堂新版最新版在线8 | 国产精品亚洲а∨无码播放麻豆 | а√天堂www在线天堂小说 | 亚洲另类伦春色综合小说 | 日韩在线不卡免费视频一区 | 网友自拍区视频精品 | 国产高潮视频在线观看 | 精品人人妻人人澡人人爽人人 | 成人毛片一区二区 | 中文字幕无码人妻少妇免费 | 国产97色在线 | 免 | 77777熟女视频在线观看 а天堂中文在线官网 | 亚洲狠狠色丁香婷婷综合 | 超碰97人人做人人爱少妇 | 亚洲精品久久久久久久久久久 | 内射爽无广熟女亚洲 | 啦啦啦www在线观看免费视频 | 99久久精品日本一区二区免费 | 日本精品人妻无码免费大全 | 欧美丰满熟妇xxxx | aa片在线观看视频在线播放 | 无码av最新清无码专区吞精 | 荡女精品导航 | 日本免费一区二区三区最新 | 国产av久久久久精东av | 无码人妻出轨黑人中文字幕 | 亚洲gv猛男gv无码男同 | 亚洲欧洲中文日韩av乱码 | 国产人妻人伦精品 | 无码吃奶揉捏奶头高潮视频 | 成人免费视频在线观看 | 久久久www成人免费毛片 | 鲁一鲁av2019在线 | 成 人 网 站国产免费观看 | 99久久久国产精品无码免费 | 久久久中文久久久无码 | aⅴ在线视频男人的天堂 | 精品久久综合1区2区3区激情 | 国产女主播喷水视频在线观看 | 国产精品无码一区二区三区不卡 | 欧美丰满少妇xxxx性 | 九九久久精品国产免费看小说 | 国产香蕉尹人综合在线观看 | 国产熟女一区二区三区四区五区 | 99er热精品视频 | 日韩少妇内射免费播放 | 粉嫩少妇内射浓精videos | 小泽玛莉亚一区二区视频在线 | 国产人妻人伦精品 | 久久久精品人妻久久影视 | 大屁股大乳丰满人妻 | 国产精品亚洲一区二区三区喷水 | 国产真实乱对白精彩久久 | 亚洲精品成人av在线 | 一本色道久久综合亚洲精品不卡 | 无码一区二区三区在线观看 | 久久精品国产大片免费观看 | 亚洲国产精品久久人人爱 | 午夜嘿嘿嘿影院 | 亚洲精品久久久久avwww潮水 | 天堂а√在线中文在线 | 97精品人妻一区二区三区香蕉 | 亚洲欧洲中文日韩av乱码 | 国产婷婷色一区二区三区在线 | a国产一区二区免费入口 | 好男人社区资源 | 中文精品无码中文字幕无码专区 | 国产精品无码一区二区三区不卡 | 综合网日日天干夜夜久久 | 中文字幕无码乱人伦 | 日本一卡2卡3卡四卡精品网站 | 一本加勒比波多野结衣 | 性生交片免费无码看人 | 色一情一乱一伦一区二区三欧美 | 久久午夜无码鲁丝片 | 精品无人国产偷自产在线 | 亚洲国产精品久久人人爱 | 国产成人人人97超碰超爽8 | 国语精品一区二区三区 | 搡女人真爽免费视频大全 | 亚洲成a人一区二区三区 | 国产av一区二区三区最新精品 | 日本一本二本三区免费 | 国色天香社区在线视频 | 一本加勒比波多野结衣 | 亚洲欧美日韩国产精品一区二区 | 狠狠色丁香久久婷婷综合五月 | 日韩欧美中文字幕公布 | 又湿又紧又大又爽a视频国产 | 精品久久久无码人妻字幂 | 久久久中文字幕日本无吗 | 亚洲精品美女久久久久久久 | 欧美 亚洲 国产 另类 | 人人妻人人藻人人爽欧美一区 | 日本欧美一区二区三区乱码 | 日韩精品一区二区av在线 | 亚洲人亚洲人成电影网站色 | 97色伦图片97综合影院 | 免费网站看v片在线18禁无码 | 少妇久久久久久人妻无码 | 欧美xxxx黑人又粗又长 | 久久久www成人免费毛片 | 欧美怡红院免费全部视频 | 亚洲成色在线综合网站 | 男女超爽视频免费播放 | 国产精品欧美成人 | 国产口爆吞精在线视频 | 色诱久久久久综合网ywww | 最近中文2019字幕第二页 | 亚洲精品综合一区二区三区在线 | 纯爱无遮挡h肉动漫在线播放 | 色欲久久久天天天综合网精品 | 综合人妻久久一区二区精品 | 久久久久亚洲精品中文字幕 | 蜜桃视频韩日免费播放 | 亚洲国产精品一区二区美利坚 | 激情内射日本一区二区三区 | www成人国产高清内射 | 国产精品.xx视频.xxtv | 桃花色综合影院 | 内射老妇bbwx0c0ck | 色一情一乱一伦一视频免费看 | 久久亚洲中文字幕无码 | 国产精品丝袜黑色高跟鞋 | 黑人大群体交免费视频 | 久久久久久亚洲精品a片成人 | 久久综合激激的五月天 | 国产麻豆精品一区二区三区v视界 | 亚洲熟妇色xxxxx欧美老妇 | 亚洲中文字幕在线观看 | 精品国产青草久久久久福利 | 亚洲中文字幕成人无码 | 亚洲伊人久久精品影院 | 亚洲色无码一区二区三区 | 扒开双腿吃奶呻吟做受视频 | 精品人妻人人做人人爽 | 亚洲精品综合五月久久小说 | 日韩无套无码精品 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产成人久久精品流白浆 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲国产精品久久久天堂 | 熟妇人妻无码xxx视频 | 日本丰满熟妇videos | 色欲人妻aaaaaaa无码 | 一区二区三区高清视频一 | 亚洲国产精品成人久久蜜臀 | 99精品无人区乱码1区2区3区 | 亚洲成a人一区二区三区 | 领导边摸边吃奶边做爽在线观看 | 国产精品久久久久无码av色戒 | 久久国产精品二国产精品 | 久久99精品久久久久婷婷 | 色综合久久网 | 性欧美疯狂xxxxbbbb | 无遮挡啪啪摇乳动态图 | 丰满人妻被黑人猛烈进入 | 国产欧美熟妇另类久久久 | 狠狠亚洲超碰狼人久久 | 久久综合九色综合欧美狠狠 | 亚洲国产欧美国产综合一区 | 强开小婷嫩苞又嫩又紧视频 | 一个人看的www免费视频在线观看 | 55夜色66夜色国产精品视频 | 欧美野外疯狂做受xxxx高潮 | 色一情一乱一伦一视频免费看 | 久久久久se色偷偷亚洲精品av | 四虎国产精品免费久久 | 一本久久a久久精品vr综合 | 好男人社区资源 | 欧美亚洲日韩国产人成在线播放 | 四虎影视成人永久免费观看视频 | аⅴ资源天堂资源库在线 | 日韩精品无码免费一区二区三区 | 日本护士毛茸茸高潮 | 大色综合色综合网站 | 精品国产福利一区二区 | 婷婷六月久久综合丁香 | 精品亚洲韩国一区二区三区 | 国产精品美女久久久久av爽李琼 | 黑人巨大精品欧美黑寡妇 | 精品久久久无码中文字幕 | 人人澡人人妻人人爽人人蜜桃 | 偷窥日本少妇撒尿chinese | 99re在线播放 | 波多野结衣乳巨码无在线观看 | 亚洲国产精品一区二区美利坚 | 97无码免费人妻超级碰碰夜夜 | 亚洲日韩av一区二区三区四区 | 暴力强奷在线播放无码 | 丰满诱人的人妻3 | 无码国产乱人伦偷精品视频 | 99久久婷婷国产综合精品青草免费 | 无码精品人妻一区二区三区av | 成在人线av无码免费 | aⅴ亚洲 日韩 色 图网站 播放 | 亚洲高清偷拍一区二区三区 | 亚洲日本va午夜在线电影 | 亚洲精品久久久久久久久久久 | 精品一区二区不卡无码av | 国产电影无码午夜在线播放 | 国产做国产爱免费视频 | 亚洲天堂2017无码 | 性开放的女人aaa片 | 国内综合精品午夜久久资源 | 丝袜人妻一区二区三区 | 久久综合色之久久综合 | 成熟女人特级毛片www免费 | 图片小说视频一区二区 | 日韩精品一区二区av在线 | 白嫩日本少妇做爰 | 国产免费观看黄av片 | 十八禁视频网站在线观看 | 无码任你躁久久久久久久 | 无码一区二区三区在线 | 蜜臀av无码人妻精品 | 亚洲国产欧美日韩精品一区二区三区 | 国产亚洲视频中文字幕97精品 | 国产精品无码一区二区桃花视频 | 99久久99久久免费精品蜜桃 | 久久精品国产亚洲精品 | 亚洲综合色区中文字幕 | 国产欧美精品一区二区三区 | 熟妇人妻无码xxx视频 | 亚洲乱码国产乱码精品精 | 六月丁香婷婷色狠狠久久 | 色综合天天综合狠狠爱 | 熟妇人妻无码xxx视频 | 欧美精品在线观看 | 久久久精品国产sm最大网站 | 天海翼激烈高潮到腰振不止 | 精品无码成人片一区二区98 | 粗大的内捧猛烈进出视频 | 久久婷婷五月综合色国产香蕉 | 中文字幕 亚洲精品 第1页 | 丰满妇女强制高潮18xxxx | 樱花草在线社区www | 强伦人妻一区二区三区视频18 | а√资源新版在线天堂 | 少妇性荡欲午夜性开放视频剧场 | 宝宝好涨水快流出来免费视频 | 国产综合久久久久鬼色 | 九九综合va免费看 | 亚洲第一网站男人都懂 | 欧美人妻一区二区三区 | 熟妇激情内射com | 亚洲欧洲日本综合aⅴ在线 | 久激情内射婷内射蜜桃人妖 | 国产激情无码一区二区 | 国产人妻人伦精品1国产丝袜 | 99久久久无码国产aaa精品 | 18禁止看的免费污网站 | 俄罗斯老熟妇色xxxx | 亚洲另类伦春色综合小说 | 高潮毛片无遮挡高清免费视频 | 国产真实夫妇视频 | 日本免费一区二区三区最新 | 亚洲一区二区三区偷拍女厕 | 国产极品美女高潮无套在线观看 | 久久久久亚洲精品男人的天堂 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 亚洲爆乳大丰满无码专区 | 国产精品久久久久9999小说 | 欧美野外疯狂做受xxxx高潮 | 精品国产一区二区三区四区 | 亚洲成色www久久网站 | 97人妻精品一区二区三区 | 人人妻人人澡人人爽欧美精品 | 精品人妻av区 | 色 综合 欧美 亚洲 国产 | 亚洲熟妇自偷自拍另类 | 亚洲国产精品无码一区二区三区 | 成年女人永久免费看片 | 日日摸日日碰夜夜爽av | 色婷婷香蕉在线一区二区 | 波多野结衣av一区二区全免费观看 | 亚洲a无码综合a国产av中文 | 中文字幕乱码亚洲无线三区 | 俺去俺来也www色官网 | 亚洲一区二区三区香蕉 | 欧美日本日韩 | 成人亚洲精品久久久久软件 | 国产精品香蕉在线观看 | 又粗又大又硬毛片免费看 | 国产激情一区二区三区 | 麻豆人妻少妇精品无码专区 | 久久综合狠狠综合久久综合88 | 无码帝国www无码专区色综合 | √天堂中文官网8在线 | 成人无码精品一区二区三区 | 青草视频在线播放 | 日产国产精品亚洲系列 | 欧美丰满熟妇xxxx | 奇米影视7777久久精品人人爽 | 国产va免费精品观看 | www国产亚洲精品久久久日本 | 亚洲日韩乱码中文无码蜜桃臀网站 | 亚洲精品国产精品乱码视色 | √天堂资源地址中文在线 | 亚洲成av人在线观看网址 | 久久久中文字幕日本无吗 | 狠狠色丁香久久婷婷综合五月 | 波多野结衣一区二区三区av免费 | 日韩 欧美 动漫 国产 制服 | 国产suv精品一区二区五 | 欧洲熟妇色 欧美 | 国产三级久久久精品麻豆三级 | 国产精品第一国产精品 | 在线观看国产午夜福利片 | 99久久精品午夜一区二区 | 久久国产精品萌白酱免费 | 国产成人无码一二三区视频 | 亚洲综合无码一区二区三区 | 日韩在线不卡免费视频一区 | 又湿又紧又大又爽a视频国产 | 波多野结衣一区二区三区av免费 | 亚洲一区二区三区偷拍女厕 | 中国女人内谢69xxxxxa片 | 一本久道久久综合婷婷五月 | 强开小婷嫩苞又嫩又紧视频 | 乱码午夜-极国产极内射 | 无码人妻av免费一区二区三区 | 小泽玛莉亚一区二区视频在线 | 少妇一晚三次一区二区三区 | 免费播放一区二区三区 | 欧美野外疯狂做受xxxx高潮 | 日本精品少妇一区二区三区 | 久久熟妇人妻午夜寂寞影院 | 日日摸日日碰夜夜爽av | 成人欧美一区二区三区黑人 | 国产精品久久久一区二区三区 | 无码帝国www无码专区色综合 | 国产亚洲精品久久久闺蜜 | 亚洲人成影院在线观看 | 97无码免费人妻超级碰碰夜夜 | 国产又爽又猛又粗的视频a片 | 亚洲无人区一区二区三区 | 成熟女人特级毛片www免费 | 乱人伦人妻中文字幕无码久久网 | 人妻无码αv中文字幕久久琪琪布 | 国产特级毛片aaaaaa高潮流水 | 国产精品久久久久久亚洲影视内衣 | 乌克兰少妇性做爰 | 亚洲日韩中文字幕在线播放 | 亚洲自偷自偷在线制服 | 无码帝国www无码专区色综合 | 久久久中文久久久无码 | 国产成人人人97超碰超爽8 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产后入清纯学生妹 | 日韩视频 中文字幕 视频一区 | 久久精品女人的天堂av | 国产激情精品一区二区三区 | 国产午夜精品一区二区三区嫩草 | 亚洲成熟女人毛毛耸耸多 | 国内综合精品午夜久久资源 | 欧洲vodafone精品性 | 国产熟妇高潮叫床视频播放 | 露脸叫床粗话东北少妇 | 18禁黄网站男男禁片免费观看 | 亚洲精品成人福利网站 | 欧美人与牲动交xxxx | 内射巨臀欧美在线视频 | 狠狠色丁香久久婷婷综合五月 | 久久伊人色av天堂九九小黄鸭 | 无码免费一区二区三区 | 国产人妻人伦精品 | 国产明星裸体无码xxxx视频 | 成人无码视频在线观看网站 | 国产偷抇久久精品a片69 | 人人妻人人澡人人爽欧美一区 | 久青草影院在线观看国产 | 国产精品igao视频网 | 亚洲成a人片在线观看无码3d | 国产精品亚洲а∨无码播放麻豆 | 国产精品无码永久免费888 | 福利一区二区三区视频在线观看 | 国产sm调教视频在线观看 | 在线观看国产一区二区三区 | 精品欧洲av无码一区二区三区 | 国产成人人人97超碰超爽8 | 精品 日韩 国产 欧美 视频 | 欧美性猛交内射兽交老熟妇 | 欧美 亚洲 国产 另类 | 国产亚洲精品久久久闺蜜 | 国产又爽又猛又粗的视频a片 | 日韩成人一区二区三区在线观看 | 国产午夜亚洲精品不卡 | 熟女俱乐部五十路六十路av | 亚洲精品成人av在线 | 亚洲综合色区中文字幕 | 黑人玩弄人妻中文在线 | 妺妺窝人体色www婷婷 | 性色欲情网站iwww九文堂 | 4hu四虎永久在线观看 | 成人无码影片精品久久久 | 狠狠色噜噜狠狠狠7777奇米 | 99久久婷婷国产综合精品青草免费 | 免费观看的无遮挡av | 黑人玩弄人妻中文在线 | 乱码av麻豆丝袜熟女系列 | 日本乱偷人妻中文字幕 | 亚洲精品中文字幕乱码 | 高潮毛片无遮挡高清免费视频 | 中文字幕人成乱码熟女app | 亚洲精品一区二区三区在线观看 | 久久久精品国产sm最大网站 | 国产午夜亚洲精品不卡下载 | 久久久久99精品成人片 | 人妻中文无码久热丝袜 | 日本一卡2卡3卡四卡精品网站 | 宝宝好涨水快流出来免费视频 | 四虎影视成人永久免费观看视频 | 国产极品美女高潮无套在线观看 | 久久精品视频在线看15 | 中文无码伦av中文字幕 | 国产精品第一国产精品 | 少妇性俱乐部纵欲狂欢电影 | 国产精品无码一区二区桃花视频 | 久久亚洲a片com人成 | 黑人大群体交免费视频 | 小sao货水好多真紧h无码视频 | 狠狠cao日日穞夜夜穞av | 夫妻免费无码v看片 | 少妇高潮一区二区三区99 | 欧美肥老太牲交大战 | 欧美日韩一区二区综合 | 欧洲熟妇精品视频 | 国产精品久久久av久久久 | 国产精品手机免费 | 色婷婷综合激情综在线播放 | 精品人妻av区 | 久久亚洲日韩精品一区二区三区 | 欧美国产亚洲日韩在线二区 | 日本一卡二卡不卡视频查询 | aⅴ在线视频男人的天堂 | 精品国产乱码久久久久乱码 | 成人影院yy111111在线观看 | 久久aⅴ免费观看 | 国产精品久久福利网站 | 丁香花在线影院观看在线播放 | 亚拍精品一区二区三区探花 | 黄网在线观看免费网站 | 在线а√天堂中文官网 | 日韩成人一区二区三区在线观看 | 精品少妇爆乳无码av无码专区 | 俺去俺来也www色官网 | 无码精品国产va在线观看dvd | 成人动漫在线观看 | 日本xxxx色视频在线观看免费 | 男女超爽视频免费播放 | 国产精品18久久久久久麻辣 | 久久亚洲精品成人无码 | 高潮毛片无遮挡高清免费 | 中文字幕无线码免费人妻 | 亚洲欧美国产精品专区久久 | 亚洲熟悉妇女xxx妇女av | 少妇人妻大乳在线视频 | 久久久久久九九精品久 | 亚洲欧美色中文字幕在线 | 精品水蜜桃久久久久久久 | 日日夜夜撸啊撸 | 日日摸日日碰夜夜爽av | 成人片黄网站色大片免费观看 | 一本色道久久综合亚洲精品不卡 | 曰韩少妇内射免费播放 | 国产色在线 | 国产 | 国产成人精品久久亚洲高清不卡 | 亚洲 激情 小说 另类 欧美 | 国产激情无码一区二区 | 国产激情精品一区二区三区 | 无码人妻少妇伦在线电影 | 大地资源中文第3页 | 99久久久无码国产aaa精品 | 狠狠色丁香久久婷婷综合五月 | 日本熟妇浓毛 | 色综合久久久无码中文字幕 | 人妻插b视频一区二区三区 | 激情人妻另类人妻伦 | 国产精品久久福利网站 | 免费人成网站视频在线观看 | 无码av最新清无码专区吞精 | 精品国产乱码久久久久乱码 | 久久99精品国产麻豆 | 国产超级va在线观看视频 | 久久午夜无码鲁丝片秋霞 | 成人综合网亚洲伊人 | 亚洲一区二区三区香蕉 | 国产亚洲精品精品国产亚洲综合 | 国产精品毛多多水多 | 日韩欧美中文字幕公布 | 一本色道久久综合狠狠躁 | 久久熟妇人妻午夜寂寞影院 | 亚洲精品欧美二区三区中文字幕 | 黄网在线观看免费网站 | 麻花豆传媒剧国产免费mv在线 | 欧美人与禽zoz0性伦交 | 国产精品久久久 | 欧美国产日韩久久mv | 夫妻免费无码v看片 | 亚洲人成网站色7799 | 久久久无码中文字幕久... | 国产熟女一区二区三区四区五区 | 蜜臀aⅴ国产精品久久久国产老师 | 国产97人人超碰caoprom | 性生交大片免费看女人按摩摩 | 激情国产av做激情国产爱 | 国产成人无码av片在线观看不卡 | 国产精品自产拍在线观看 | 国产成人久久精品流白浆 | 一本无码人妻在中文字幕免费 | 日韩欧美中文字幕公布 | 日本护士毛茸茸高潮 | 成年女人永久免费看片 | 免费看男女做好爽好硬视频 | 亚洲欧美日韩综合久久久 | 国产成人无码专区 | 亚洲精品一区二区三区大桥未久 | 国产艳妇av在线观看果冻传媒 | 国产成人一区二区三区别 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 国产香蕉97碰碰久久人人 | 国产精品久免费的黄网站 | 伊人色综合久久天天小片 | 18无码粉嫩小泬无套在线观看 | 国产亚洲精品久久久久久大师 | 人人妻人人藻人人爽欧美一区 | 国产精品无码一区二区桃花视频 | 又粗又大又硬又长又爽 | 亚洲精品综合五月久久小说 | 国产亚洲视频中文字幕97精品 | 好屌草这里只有精品 | 婷婷五月综合缴情在线视频 | 精品无码国产一区二区三区av | 乱码午夜-极国产极内射 | 国产香蕉尹人视频在线 | 天堂在线观看www | 成人无码精品1区2区3区免费看 | 福利一区二区三区视频在线观看 | 久久久精品国产sm最大网站 | 熟妇女人妻丰满少妇中文字幕 | 精品人人妻人人澡人人爽人人 | 亚洲欧美国产精品专区久久 | 日日躁夜夜躁狠狠躁 | av人摸人人人澡人人超碰下载 | 成 人 免费观看网站 | 久久久av男人的天堂 | 天堂а√在线地址中文在线 | 日本乱人伦片中文三区 | 永久免费观看国产裸体美女 | 99久久精品日本一区二区免费 | 欧美高清在线精品一区 | 亚洲日韩av一区二区三区中文 | 漂亮人妻洗澡被公强 日日躁 | 亚洲自偷自拍另类第1页 | 亚洲七七久久桃花影院 | 爽爽影院免费观看 | 国产女主播喷水视频在线观看 | 装睡被陌生人摸出水好爽 | 男人扒开女人内裤强吻桶进去 | 日本在线高清不卡免费播放 | 美女扒开屁股让男人桶 | 欧美日韩亚洲国产精品 | 久久综合给久久狠狠97色 | 久久久久久国产精品无码下载 | 国产精品欧美成人 | 性做久久久久久久免费看 | 狂野欧美激情性xxxx | 欧美人妻一区二区三区 | 婷婷五月综合缴情在线视频 | а√天堂www在线天堂小说 | 国产在线aaa片一区二区99 | 日本丰满熟妇videos | 亚洲第一网站男人都懂 | 色欲人妻aaaaaaa无码 | 久久久久成人精品免费播放动漫 | 久久亚洲国产成人精品性色 | 精品国精品国产自在久国产87 | 久久久国产一区二区三区 | 精品熟女少妇av免费观看 | 老太婆性杂交欧美肥老太 | 欧美日韩视频无码一区二区三 | 18精品久久久无码午夜福利 | 天堂а√在线地址中文在线 | 老熟妇乱子伦牲交视频 | 国产乡下妇女做爰 | 九一九色国产 | 欧美性黑人极品hd | 国产凸凹视频一区二区 | 一本久久a久久精品亚洲 | 色婷婷av一区二区三区之红樱桃 | 伊人色综合久久天天小片 | 国产精品18久久久久久麻辣 | 熟女少妇在线视频播放 | 麻豆成人精品国产免费 | 欧美人与动性行为视频 | 欧美性生交活xxxxxdddd | 国产热a欧美热a在线视频 | 国内揄拍国内精品少妇国语 | 久久精品无码一区二区三区 | 亚洲国产高清在线观看视频 | 亚洲男女内射在线播放 | 国产美女精品一区二区三区 | 国产精品久久久久9999小说 | 老子影院午夜精品无码 | 欧美国产日产一区二区 | 国产九九九九九九九a片 | 午夜精品久久久久久久久 | 久久久久久久女国产乱让韩 | 欧美日韩综合一区二区三区 | 久久久精品成人免费观看 | 99精品国产综合久久久久五月天 | 国产真实乱对白精彩久久 | 人妻互换免费中文字幕 | 国模大胆一区二区三区 | 国产尤物精品视频 | 国产成人无码午夜视频在线观看 | 内射欧美老妇wbb | 日韩精品无码免费一区二区三区 | 四十如虎的丰满熟妇啪啪 | 色欲久久久天天天综合网精品 | 久久久中文久久久无码 | 欧美人妻一区二区三区 | 给我免费的视频在线观看 | 狂野欧美性猛交免费视频 | 又湿又紧又大又爽a视频国产 | 久久综合激激的五月天 | 亚洲伊人久久精品影院 | 狠狠综合久久久久综合网 | 欧美精品免费观看二区 | 蜜桃av抽搐高潮一区二区 | 高清国产亚洲精品自在久久 | 无套内射视频囯产 | 国产在线精品一区二区高清不卡 | 国产精品高潮呻吟av久久4虎 | 青草青草久热国产精品 | av在线亚洲欧洲日产一区二区 | 亚洲毛片av日韩av无码 | 亚洲人亚洲人成电影网站色 | 装睡被陌生人摸出水好爽 | 亚洲精品鲁一鲁一区二区三区 | 中文字幕av无码一区二区三区电影 | 亚洲高清偷拍一区二区三区 | 日本肉体xxxx裸交 | 亚洲一区二区三区四区 | 欧美 亚洲 国产 另类 | 偷窥村妇洗澡毛毛多 | 亚洲中文字幕在线无码一区二区 | 欧洲熟妇色 欧美 | 人妻人人添人妻人人爱 | 国产成人无码av片在线观看不卡 | 国产亚洲人成在线播放 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 性生交大片免费看l | 国产热a欧美热a在线视频 | 国产亚洲精品久久久久久 | 亚洲a无码综合a国产av中文 | 欧美喷潮久久久xxxxx | 日本大乳高潮视频在线观看 | 强辱丰满人妻hd中文字幕 | 97精品人妻一区二区三区香蕉 | 国产亚洲日韩欧美另类第八页 | 最新国产麻豆aⅴ精品无码 | 日韩亚洲欧美中文高清在线 | 中文无码精品a∨在线观看不卡 | 天天av天天av天天透 | 亚洲精品中文字幕久久久久 | 少妇性荡欲午夜性开放视频剧场 | 日日天干夜夜狠狠爱 | 人人澡人人透人人爽 | 国产精品毛多多水多 | 天天做天天爱天天爽综合网 | 久久人人爽人人爽人人片av高清 | 国产猛烈高潮尖叫视频免费 | 无码av最新清无码专区吞精 | 麻豆国产人妻欲求不满谁演的 | 午夜成人1000部免费视频 | 亚洲成a人片在线观看日本 | 97精品人妻一区二区三区香蕉 | 人人妻人人澡人人爽人人精品浪潮 | 99久久婷婷国产综合精品青草免费 | 国产亚洲精品久久久久久国模美 | 亚洲成av人综合在线观看 | 精品国产一区二区三区四区 | 成熟女人特级毛片www免费 | 精品欧洲av无码一区二区三区 | 久久久久久国产精品无码下载 | 色情久久久av熟女人妻网站 | 色欲久久久天天天综合网精品 | 无码吃奶揉捏奶头高潮视频 | 久久久久久国产精品无码下载 | 99精品久久毛片a片 | 欧美高清在线精品一区 | 欧美黑人性暴力猛交喷水 | 国产成人无码av一区二区 | 人妻插b视频一区二区三区 | 99re在线播放 | 青草青草久热国产精品 | 99riav国产精品视频 | 成 人 网 站国产免费观看 | 一本精品99久久精品77 | 国产后入清纯学生妹 | 性史性农村dvd毛片 | 亚洲爆乳精品无码一区二区三区 | 荫蒂添的好舒服视频囗交 | 国产精品久久久av久久久 | 秋霞特色aa大片 | 国产高清不卡无码视频 | 国产精品无码一区二区桃花视频 | 国产成人无码a区在线观看视频app | 中文亚洲成a人片在线观看 | av人摸人人人澡人人超碰下载 | 久久97精品久久久久久久不卡 | 伊人色综合久久天天小片 | 性欧美熟妇videofreesex | 国产高潮视频在线观看 | 狠狠综合久久久久综合网 | 欧美日韩综合一区二区三区 | 无码毛片视频一区二区本码 | 国产熟妇另类久久久久 | 亚洲理论电影在线观看 | 亚洲国产精品无码久久久久高潮 | 久久久久成人精品免费播放动漫 | 久久综合香蕉国产蜜臀av | 亚洲人亚洲人成电影网站色 | 国产精品嫩草久久久久 | 日本一本二本三区免费 | 国产在线一区二区三区四区五区 | 日日摸天天摸爽爽狠狠97 | 在线视频网站www色 | 国产精品久久久av久久久 | 国产精品第一区揄拍无码 | 精品午夜福利在线观看 | 国产精品毛多多水多 | 国产激情无码一区二区app | 97人妻精品一区二区三区 | 国产性生大片免费观看性 | 无码av免费一区二区三区试看 | 亚洲中文字幕乱码av波多ji | 人人爽人人澡人人高潮 | 97se亚洲精品一区 | 美女黄网站人色视频免费国产 | 高中生自慰www网站 | 亚洲精品一区二区三区在线 | 高潮喷水的毛片 | 成在人线av无码免观看麻豆 | 亚洲中文字幕va福利 | 免费观看黄网站 | 久久五月精品中文字幕 | 国产成人综合色在线观看网站 | 欧美人与动性行为视频 | 亚洲欧美日韩综合久久久 | 又粗又大又硬毛片免费看 | 成人片黄网站色大片免费观看 | 中文字幕人成乱码熟女app | 免费中文字幕日韩欧美 | 99在线 | 亚洲 | 国产办公室秘书无码精品99 | 岛国片人妻三上悠亚 | 国产午夜手机精彩视频 | 亚洲成a人片在线观看无码3d | 正在播放老肥熟妇露脸 | 亚洲中文字幕无码一久久区 | 精品欧洲av无码一区二区三区 | 性欧美熟妇videofreesex | 日日摸天天摸爽爽狠狠97 | 中文字幕av日韩精品一区二区 | 久久久国产一区二区三区 | 伊在人天堂亚洲香蕉精品区 | 天天爽夜夜爽夜夜爽 | 国产成人一区二区三区在线观看 | 欧美大屁股xxxxhd黑色 | 欧美丰满熟妇xxxx性ppx人交 | 1000部啪啪未满十八勿入下载 | 日韩人妻少妇一区二区三区 | 日日躁夜夜躁狠狠躁 | 欧美激情一区二区三区成人 | 免费观看又污又黄的网站 | 性开放的女人aaa片 | 亚洲精品国偷拍自产在线麻豆 |