進程對列,生產者和消費者,JoinableQueue

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("主程序執行結束。。。")
相關文章
相關標籤/搜索