2016-12-06 53 views
0

我正在使用協程管道進行事件驅動的數據管道。到目前爲止,一切都很順利。我想嘗試批量處理一些輸入,但需要一種方法來確保在上游生產者爲空時處理最終批次。在下面的設計示例中,一旦完成produce_data_from,這將成爲print(res)print_data_cp中的一種方式。一個更直接的模擬將是每次打印並重置res其長度== 3,並且保證在生產者完成後打印res中剩餘的值。我知道有幾種方法可以解決這個問題,但是有沒有一種習慣解決這個問題的方法(例如,前哨值,返回餘數,while/finally,wrap in class)?當生產者耗盡時,有沒有辦法發出協程?

現在,我將coprocess函數作爲類的一部分,並讓res爲實例變量,以便在coprocess函數完成後可以訪問它。這有效,但一段時間/最後會更普遍。

def produce_data_from(data, consumer): 
    next(consumer) 
    for x in data: 
     consumer.send(x) 

def print_data_cp(): 
    res = [] 
    while True: 
     x = (yield) 
     res.append(x) 
     print(x) 

cons = print_data_cp() 
produce_data_from(range(10), cons) 

回答

0

此修改使用try/finally並更改生產者關閉消費者協處理。這會觸發finally塊。在這裏,協處理器依賴於生產者發送信號,所以將消費者功能修改爲批處理需要修改上游生產者功能。不理想,但它的工作原理和感覺足夠pythonic。我很高興看到其他方法。

def produce_data_from(data, consumer): 
    next(consumer) 
    for x in data: 
     consumer.send(x) 
    consumer.close() 

def print_data_cp(): 
    res = [] 
    try: 
     while True: 
      x = (yield) 
      res.append(x) 
      if len(res) >= 3: 
       print(res) 
       res = [] 
    finally: 
     print(res) 

cons = print_data_cp() 
produce_data_from(range(10), cons) 
相關問題