一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - 詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例

詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例

2020-12-01 00:28qindongliang1922 Python

這篇文章主要介紹了詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例的相關資料,這里使用了線程知識,隊列知識及循環(huán)的知識,需要的朋友可以參考下

詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例

散仙使用python3.4模擬實現(xiàn)的一個生產(chǎn)者與消費者的例子,用到的知識有線程,隊列,循環(huán)等,源碼如下:

Python代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
import queue
import time
import threading
import random
 
 
q=queue.Queue(5)
 
#生產(chǎn)者
def pr():
  name=threading.current_thread().getName()
  print(name+"線程啟動......")
  for i in range(100):
    t=random.randint(2,9)
    print(name,"睡眠時間: ",t)
    time.sleep(t);
    d="A"+str(i)
    print(name+"正在存第",i+1,"個數(shù)據(jù): ",d)
    #q.put("A"+str(i),False,2000)
    q.put(d)
  print("生產(chǎn)完畢!")
 
 
#消費者
def co():
  name=threading.current_thread().getName()
  time.sleep(1)
  print(name+"線程啟動......")
 
  while True:
    print(name+"檢測到隊列數(shù)量: ",q.qsize())
    t=random.randint(2,9)
    print(name,"睡眠時間: ",t)
    data=q.get();
    print(name+"消費一個數(shù)據(jù): ",data)
 
 
 
 
p=threading.Thread(target=pr,name="生產(chǎn)者")
c=threading.Thread(target=co,name="消費者1")
c2=threading.Thread(target=co,name="消費者2")
 
p.start()
c.start()
c2.start()

在本例里面散仙啟動了1個生產(chǎn)者線程,2個消費者線程,打印效果如下:

Python代碼 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
生產(chǎn)者線程啟動......
生產(chǎn)者 睡眠時間: 4
消費者1線程啟動......
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 2
消費者2線程啟動......
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 3
生產(chǎn)者正在存第 1 個數(shù)據(jù): A0
生產(chǎn)者 睡眠時間: 9
消費者1消費一個數(shù)據(jù): A0
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 8
生產(chǎn)者正在存第 2 個數(shù)據(jù): A1
生產(chǎn)者 睡眠時間: 5
消費者2消費一個數(shù)據(jù): A1
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 7
生產(chǎn)者正在存第 3 個數(shù)據(jù): A2
生產(chǎn)者 睡眠時間: 8
消費者1消費一個數(shù)據(jù): A2
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 2
生產(chǎn)者正在存第 4 個數(shù)據(jù): A3
生產(chǎn)者 睡眠時間: 7
消費者2消費一個數(shù)據(jù): A3
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 9
生產(chǎn)者正在存第 5 個數(shù)據(jù): A4
生產(chǎn)者 睡眠時間: 2
消費者1消費一個數(shù)據(jù): A4
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 5
生產(chǎn)者正在存第 6 個數(shù)據(jù): A5
生產(chǎn)者 睡眠時間: 5
消費者2消費一個數(shù)據(jù): A5
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 6
生產(chǎn)者正在存第 7 個數(shù)據(jù): A6
生產(chǎn)者 睡眠時間: 7
消費者1消費一個數(shù)據(jù): A6
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 7
生產(chǎn)者正在存第 8 個數(shù)據(jù): A7
生產(chǎn)者 睡眠時間: 3
消費者2消費一個數(shù)據(jù): A7
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 8
生產(chǎn)者正在存第 9 個數(shù)據(jù): A8
生產(chǎn)者 睡眠時間: 2
消費者1消費一個數(shù)據(jù): A8
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 4
生產(chǎn)者正在存第 10 個數(shù)據(jù): A9
生產(chǎn)者 睡眠時間: 4
消費者2消費一個數(shù)據(jù): A9
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 5
生產(chǎn)者正在存第 11 個數(shù)據(jù): A10
生產(chǎn)者 睡眠時間: 2
消費者1消費一個數(shù)據(jù): A10
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 3
生產(chǎn)者正在存第 12 個數(shù)據(jù): A11
生產(chǎn)者 睡眠時間: 3
消費者2消費一個數(shù)據(jù): A11
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 3
生產(chǎn)者正在存第 13 個數(shù)據(jù): A12
生產(chǎn)者 睡眠時間: 3
消費者1消費一個數(shù)據(jù): A12
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 3
生產(chǎn)者正在存第 14 個數(shù)據(jù): A13
生產(chǎn)者 睡眠時間: 8
消費者2消費一個數(shù)據(jù): A13
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 7
生產(chǎn)者正在存第 15 個數(shù)據(jù): A14
生產(chǎn)者 睡眠時間: 3
消費者1消費一個數(shù)據(jù): A14
消費者1檢測到隊列數(shù)量: 0
消費者1 睡眠時間: 7
生產(chǎn)者正在存第 16 個數(shù)據(jù): A15
生產(chǎn)者 睡眠時間: 2
消費者2消費一個數(shù)據(jù): A15
消費者2檢測到隊列數(shù)量: 0
消費者2 睡眠時間: 9

從這個例子中,我們發(fā)現(xiàn)利用隊列,來做同步時非常簡單方便的,除此之外隊列,還有如下幾個方便的方法:

介紹一下此包中的常用方法:   

?
1
2
3
4
5
6
7
8
9
10
Queue.qsize() 返回隊列的大小 
Queue.empty() 如果隊列為空,返回True,反之False
Queue.full() 如果隊列滿了,返回True,反之False
Queue.full 與 maxsize 大小對應 
Queue.get([block[, timeout]])獲取隊列,timeout等待時間 
Queue.get_nowait() 相當Queue.get(False)
非阻塞 Queue.put(item) 寫入隊列,timeout等待時間 
Queue.put_nowait(item) 相當Queue.put(item, False)
Queue.task_done() 在完成一項工作之后,Queue.task_done()函數(shù)向任務已經(jīng)完成的隊列發(fā)送一個信號
Queue.join() 實際上意味著等到隊列為空,再執(zhí)行別的操作

以上就是詳解Python 模擬實現(xiàn)生產(chǎn)者消費者模式的實例,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

原文鏈接:http://qindongliang.iteye.com/blog/2115950

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 明星ai智能人脸替换造梦在线播放 | 女上男下gifxxoo动态视频 | 波多野结衣黑人系列在线观看 | 韩日一区二区三区 | free嫩白的12sex性自由 | 午夜免费啪视频观看视频 | 男女做性视频 | 91进入蜜桃臀在线播放 | 精品一久久香蕉国产线看观 | 男同巨黄gay小说好爽 | 国产香蕉一区二区精品视频 | 四虎国产精品视频免费看 | 国产精品一级香蕉一区 | www.最色| 好大好硬好深好爽想要之黄蓉 | 免费在线观看视频 | 亚洲人影院 | 好涨好大我快受不了了视频网 | 无人区大片免费播放器 | 亚洲美女爱爱 | 免费370理论片中文字幕 | 亚洲四虎永久在线播放 | 男女男精品视频 | 91yellow吧字幕网zmff7 | 免费观看美景之屋 | 亚洲国产免费 | 亚洲天堂色图 | 国产成人一区二区三区在线视频 | 色卡7707c| 苍井空av | 午夜毛片在线观看 | 99精品热视频 | 国产高清在线看 | 国产新疆成人a一片在线观看 | 深夜影院深a久久 | japanese秘书丝袜| 黑人疯狂巨大xxoo | 亚洲视频一区在线播放 | 午夜亚洲精品久久久久久 | 四虎免费永久观看 | 久久一本综合 |