2019 5 20未命名檔案

2022-03-21 15:13:17 字數 3974 閱讀 9603

新建模板

小書匠歡迎使用小書匠(

xiaoshujiang

)編輯器,您可以通過小書匠主按鈕》模板裡的模板管理來改變新建文章的內容。

joinablequeue實現生產者消費者模型

1、使用queue實現的**

import time

import random

from multiprocessing import process,queue

def producer(q,name,food):

for i in range(2):

time.sleep(random.random())

fd = '%s%s'%(food,i)

q.put(fd)

print('%s生產了乙個%s'%(name,food))

def consumer(q,name):

while true:

food = q.get()

if not food:break

time.sleep(random.randint(1,3))

print('%s吃了%s'%(name,food))

def cp(c_count,p_count):

q = queue(10)

for i in range(c_count):

process(target=consumer, args=(q, '灰太狼')).start()

p_l =

for i in range(p_count):

p1 = process(target=producer, args=(q, '喜洋洋', '包子'))

p1.start()

for p in p_l:p.join()

for i in range(c_count):

q.put(none)

if __name__ == '__main__':

cp(2,3)

----------------結果:

喜洋洋生產了乙個包子

喜洋洋生產了乙個包子

喜洋洋生產了乙個包子

喜洋洋生產了乙個包子

喜洋洋生產了乙個包子

喜洋洋生產了乙個包子

灰太狼吃了包子1

灰太狼吃了包子0

灰太狼吃了包子0

灰太狼吃了包子0

灰太狼吃了包子1

灰太狼吃了包子1

2、使用joinablequeue實現佇列

(1)消費者不需要判斷從佇列裡拿到none再退出執行消費者函式了

(2)消費者每次從佇列裡面q.get()乙個資料,處理過後就使用佇列.task_done()

(3)生產者for迴圈生產完所有產品,需要q.join()阻塞一下,對這個佇列進行阻塞。

(4)啟動乙個生產者,啟動乙個消費者,並且這個消費者做成守護程序,然後生產者需要p.join()阻塞一下。

(5)我啟動了生產者之後,生產者函式一直在生成資料,直到生產完所有資料將佇列q.join()一下,意思是當我生產的資料都被消費者消費完之後 佇列的阻塞才結束。

(6)結束過程:消費者這邊是每消費完乙個資料給佇列返回乙個q.task_done(),直到所有的資料都被消費完之後,生產者函式這邊的佇列.阻塞結束了,佇列阻塞結束了生產者函式執行結束了。生產者函式結束了,那麼p.join()生產者程序物件就結束了。生產者程序物件結束了整個主程序的**就執行結束了。主程序**結束了守護程序及消費者程序也結束了

import time

import random

from multiprocessing import joinablequeue,process

def producer(q,name,food):

for i in range(5):

time.sleep(random.random())

fd = '%s%s'%(food,i+1)

q.put(fd)

print('%s生產了乙個%s'%(name,food))

q.join()#(3)生產者for迴圈生產完所有產品,需要q.join()阻塞一下,對這個佇列進行阻塞。

#(5)我啟動了生產者之後,生產者函式一直在生成資料,直到生產完所有資料將佇列q.join()一下,意思是當我生產的資料都被消費者消費完之後 佇列的阻塞才結束。

def consumer(q,name): #(1)消費者不需要像queue那樣判斷從佇列裡拿到none再退出執行消費者函式了

while true:

food = q.get()

time.sleep(random.random())

print('%s吃了%s'%(name,food))

q.task_done() #(2)消費者每次從佇列裡面q.get()乙個資料,處理過後就使用佇列.task_done()

if __name__ == '__main__':

jq = joinablequeue()

p =process(target=producer,args=(jq,'喜洋洋','包子')) #

p.start() #(4)啟動乙個生產者,啟動乙個消費者,並且這個消費者做成守護程序,然後生產者需要p.join()阻塞一下。

c = process(target=consumer,args=(jq,'灰太狼'))

c.daemon = true #

c.start()

p.join()

#(6)結束過程:消費者這邊是每消費完乙個資料給佇列返回乙個q.task_done(),直到所有的資料都被消費完之後,生產者函式這邊的佇列.阻塞結束了,佇列阻塞結束了生產者函式執行結束了。生產者函式結束了,那麼p.join()生產者程序物件就結束了。生產者程序物件結束了整個主程序的**就執行結束了。主程序**結束了守護程序即消費者程序也結束了

---------------結果:

喜洋洋生產了乙個包子

灰太狼吃了包子1

喜洋洋生產了乙個包子

喜洋洋生產了乙個包子

喜洋洋生產了乙個包子

喜洋洋生產了乙個包子

灰太狼吃了包子2

灰太狼吃了包子3

灰太狼吃了包子4

灰太狼吃了包子5

import time

import random

from multiprocessing import joinablequeue,process

def producer(q,name,food):

for i in range(5):

time.sleep(random.random())

fd = '%s%s'%(food,i+1)

q.put(fd)

print('%s生產了乙個%s'%(name,food))

q.join()

def consumer(q,name):

while true:

food = q.get()

time.sleep(random.random())

print('%s吃了%s'%(name,food))

q.task_done()

if __name__ == '__main__':

jq = joinablequeue()

p =process(target=producer,args=(jq,'喜洋洋','包子'))

p.start()

c = process(target=consumer,args=(jq,'灰太狼'))

c.daemon = true

c.start()

p.join()

3、二者區別

1)queue有多少消費者,就要put多少個none。要在消費者函式新增if 不是真(非none資料)就退出死迴圈

2)二者效果一樣但是從程式設計師角度看,joinablequeue更加嚴謹,更符合程式設計思維

2018 8 27未命名檔案

import re email list xiaowang 163.cn xiaowang 163.comheihei xiaowang qq.com for email in email list ret re.match w 163 com email ret re.match r 0 9a z...

2018 9 11未命名檔案

新建模板 小書匠預 測 1 0實 1 true positive tp false negative fn 際 0 false positive fp true negative tn true positive 真正,tp 將正類 為正類數.true negative 真負 tn 將負類 為負類數...

指令碼未命名

根據不同型別的攻擊計算傷害public int calculatedamage int type float ratio else if type 4 kplayer.i.hitlife int 500 ratio else if type 5 表示匕首攻擊力 return damage publi...