2015-07-13 38 views
0

我有一種情況,我必須同時讀取和寫入列表。 似乎代碼在完成寫入列表中的所有元素後開始讀取。我想要做的事情是代碼將一直添加元素,並且需要同時處理前10個元素。python追加並從列表中同時讀取

import csv 

testlist=[] 
with open('some.csv', 'rb') as f: 
    reader = csv.reader(f) 
    for row in reader: 
     testlist.append(row) 



def render(small) 
    #do some stuff 



while(len(testlist)>0) 
     pool = Pool(processes=10) 
     small=testlist[:10] 
     del testlist[:10] 
     pool.map_async(render,small) 
     pool.close() 
     pool.join() 
+0

你不覺得在閱讀第11個元素後,前10個元素將始終是不變的 – therealprashant

+0

一旦我處理了前10個元素,我將從列表中刪除它。所以我不認爲這會一直是相同的。 –

+0

生產者/消費者案例? – sinhayash

回答

-1

你可以像這樣

x=[] 
y=[1,2,3,4,5,6,7,...] 
for i in y: 
    x.append(i) 
    if len(x)<10: 
     print x 
    else: 
     print x[:10] 
     x=x-x[:10] 

PS:假設y是一個無限流

2

需要被處理之間共享的隊列。一個進程將隊列中的其他進程添加到隊列中。

下面是一個簡單的例子:

from multiprocessing import Process, Queue 

def put(queue): 
    # writes items to the queue 
    queue.put('something') 

def get(queue): 
    # gets item from the queue to work on 
    while True: 
    item = queue.get() 
    # do something with item 

if __name__=='__main__': 
    queue = Queue() 
    getter_process = Process(target=get, args=((queue),)) 
    getter_process.daemon = True 
    getter_process.start() 
    writer(queue)   # Send something to the queue 
    getter_process.join() # Wait for the getter to finish 

如果你想一次只能處理10個東西,你可以限制隊列的大小爲10。這意味着,在「作家」不能寫任何東西,直到當該隊列已經有10個項目在等待處理。

默認情況下,隊列沒有邊界/限制。 documentation是一個很好的開始排隊的好地方。