1.進程對列 dom
讓進程之間共享資源spa
先進先出code
(1)基本語法orm
from multiprocessing import Process,Queue q = Queue() # 1.用put方法往隊列中存值 q.put(111) # 2.用get方法從隊列中取值 res= q.get() print(res) # 3.當隊列中沒有值,再調用get就會發生阻塞 res = q.get() print(res) # 4.get_nowait 在沒有值的時候,直接報錯。錯在兼容性問題,不推薦使用 res = q.get_nowait() print(res) # (2) 指定隊列長度 能夠適用queue q1 = Queue(3) q1.put(11) q1.put(22) q1.put(33) # 注意:若是超出隊列長度,直接阻塞 # q1.put(44) # 注意:若是超出了隊列長度,直接報錯(不推薦) # q1.put_nowait(44)
(2)多進程之間共享數據blog
from multiprocessing import Process,Queue def func(q): # 2.在子進程中獲取數據 res = q.get() print(res) # 3.子進程添加數據 q.put("bbb") if __name__ == '__main__': q2 = Queue() p1 = Process(target=func,args=(q2,)) p1.start() # 1.在主進程中,添加數據 q2.put("aaa") # 爲了可以拿到子進程中添加的隊列元素,須要等待子進程執行結束後獲取 p1.join() # 4.主進程獲取子進程添加的數據 res = q2.get() print("主進程執行結束:值%s" % (res))
2.生產者和消費者模型隊列
# 爬蟲例子:
1號進程負責抓取網頁當中的內容
2號進程負責匹配網頁當中的關鍵字進程
1號進程能夠理解爲生產者
2號進程能夠理解爲消費者
理想的生產者和消費者模型:彼此運行的速度至關;ip
從程序上來說:
生產者就是負責存儲數據(put)
消費者就是負責獲取數據(get)資源
(1)基本語法get
from multiprocessing import Process,Queue import time,random def consumer(q,name): while True: food = q.get() time.sleep(random.uniform(0.1,1)) print("%s 吃了一個%s"% (name,food)) # 生產者模型 def producer(q,name,food): for i in range(5): time.sleep(random.uniform(0.1,1)) print("%s 生產了 %s%s"%(name,food,i)) q.put(food+str(i)) if __name__ == '__main__': q=Queue() # 建立生產者 p1 = Process(target=producer,args=(q,"周永林","大便")) p1.start() # 建立消費者 c1 = Process(target=consumer,args=(q,"張龍")) c1.start() p1.join() print("主程序執行結束。。。")
3.JoinableQueue
put 尋訪
get 獲取
task_done 隊列數據減一
join 阻塞
task_done 與 join 經過一箇中間變量統計隊列中元素個數
每放入一個值,成員中的中間變量值加1
每執行一次task_done,成員中的中間變量值減1
join 會根據中間變量值來肯定是阻塞仍是放行
若是中間變量是0 意味着放行
若是中間變量不是0 意味着阻塞
(1)基本用法
from multiprocessing import Process,JoinableQueue jq = JoinableQueue() jq.put("abab") print(jq.get()) jq.task_done() # jq.join() print("finish")
(2)生產者和消費者模型
from multiprocessing import Process,JoinableQueue # 消費着模型 def consumer(q,name): while True: food = q.get() time.sleep(random.uniform(0.1,1)) print("%s吃了一個%s"%(name,food)) q.task_done() #生產着模型 def producer(q,name,food): for i in range(5): time.sleep(random.uniform(0.1,1)) print("%s生產了 %s%s"%(name,food,i)) q.put(food+str(i)) if __name__ == '__main__': # 建立隊列 jq = JoinableQueue() #消費着進程 c1 = Process(target=consumer,args=(jq,"張曉東")) c1.daemon = True c1.start() #生產者進程 p1 = Process(target=producer,args=(jq,"黃樂熙","大茄子")) p1.start() #等待生產者把全部數據放到隊列中; p1.join() # 直到全部數據被消費完畢以後,放行。 jq.join() print("主程序執行結束。。。")