2015-07-13 3 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

Не считаете, что первые 10 элементов всегда будут постоянными после прочтения 11-го элемента. – 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: если предположить у является бесконечным потоком

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 - хорошее место, чтобы начать больше в очередях.

Смежные вопросы