2016-02-15 3 views
0

Im реализует многопоточную функциональность с использованием шаблона проектирования, обсуждаемого в this answer и this blog post.Многопоточная функциональность с динамическим вводом данных

Мой источник данных является динамическим (поставляется с веб-POST), но все примеры, которые я могу найти, используют статический источник данных.

Мой вопрос: Как реализовать многопоточную функциональность с источником нестатического источника данных?

Пример код:

import urllib2 
from multiprocessing.dummy import Pool as ThreadPool 

# This is a static data source. I need it to be dynamic! 
urls = [ 
    'http://www.python.org', 
    'http://www.python.org/about/', 
    # etc.. 
    ] 

# Make the Pool of workers 
pool = ThreadPool(4) 
# Open the urls in their own threads 
# and return the results 
results = pool.map(urllib2.urlopen, urls) 
#close the pool and wait for the work to finish 
pool.close() 
pool.join() 

ответ

1

Я полагаю, что нестатическими вы имеете в виду источника, который производит его элементы, а рабочие уже потребляют их. В этом случае вы можете использовать API Pool.imap() и передать генератор вместо подготовленного списка.

import multiprocessing.dummy 
import threading 


def generate(): 
    for i in range(20): 
     print('generating {}'.format(i)) 
     yield i 


def consume(i): 
    print('thread {} consuming {}'.format(threading.current_thread().ident, i)) 


pool = multiprocessing.dummy.Pool(4) 

list(pool.imap(consume, generate())) 

Будьте осторожны, чтобы на самом деле потребляют Iterable, который является возвращаемым значением Pool.imap() вызова.

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