新建模板
小書匠歡迎使用小書匠(
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...