1. 程式人生 > >Python連載38-協程、可迭代、迭代器、生產者消費者模型

Python連載38-協程、可迭代、迭代器、生產者消費者模型

一、生產者消費者模型

import multiprocessing

from time import ctime

def consumer(input_q):

    print("Into consumer:",ctime())

    while True:

        #處理項

        item = input_q.get()

        print("pull",item,"out of q")#此處替換為有用的工作

        input_q.task_done()#發出訊號通知任務完成

    print("Out of consumer:",ctime()) #此句未執行,因為q.join()收集到四個task_done()訊號後,主程序啟動

def producer(sequence,output_q):

    print("Into producer:",ctime())

    for item in sequence:

        output_q.put(item)

        print("put",item,"into_q")

    print("Out of producer:",ctime())

#建立程序

if __name__ == "__main__":

    q=multiprocessing.JoinableQueue()

    #執行消費者程序

    cons_p = multiprocessing.Process(target=consumer,args=(q,))

    cons_p.daemon = True

    cons_p.start()

​

    #生產多個項,sequence代表要傳送給消費者的項序列

    #在實踐中,這可能是生成器的輸出或通過一些其他方式生產出來的

    sequence = [1,2,3,4]

    producer(sequence,q)

    #等待所有項被處理

    q.join()

 

二、協程

1.協程參考資料:

http://python.jobble.com/86481/

http://python.jobble.com/87310/

https://segmentfault.com/a/1190000009781688

2.迭代器參考資料

可迭代(iterable):直接作用於for迴圈變數

迭代器(Iterator):不但可以作用於for迴圈,還可以被next呼叫

3.關係:list是一個典型的可迭代物件,但是不是一個迭代器,因為list不可以被next呼叫

4.判斷標準:通過isinstance來判斷某個變數是否是一個例項,判斷是否可以迭代

from collections import Iterable,Iterator

​

l = [i for i in range(5)]  #可迭代

print(isinstance(l,Iterable))#判斷是否可迭代

print(isinstance(l,Iterator))#判斷是否是一個迭代器

​

s_iter = iter(l)#將其轉換為可以迭代的和迭代器

print(isinstance(s_iter,Iterable))#判斷是否可迭代

print(isinstance(s_iter,Iterator))#判斷是否是一個迭代器


三、原始碼

d26_2_consumer_and_producer_model.py

d27_1_iterable_and_iterator_and_their_transform.py

https://github.com/ruigege66/Python_learning/blob/master/d26_2_consumer_and_producer_model.py

https://github.com/ruigege66/Python_learning/blob/master/d27_1_iterable_and_iterator_and_their_transform.py​

2.CSDN:https://blog.csdn.net/weixin_44630050(心悅君兮君不知-睿)

3.部落格園:https://www.cnblogs.com/ruigege0000/

4.歡迎關注微信公眾號:傅立葉變換,個人公眾號,僅用於學習交流,後臺回覆”禮包“,獲取大資料學習資料

 

&n