Из вашего описания звучит так, что вы не столько заинтересованы в обработке данных, сколько в том, как они поступают, а в том, чтобы избежать передачи миллиона элементов list
назад.
Есть более простой способ сделать это: просто поместить данные в файл. Например:
def target_fnc(arg):
fd, path = tempfile.mkstemp(text=True)
with os.fdopen(fd) as f:
for i in xrange(1000000):
f.write('dvsdbdfbngd\n')
return path
def process_args(some_args):
pool = Pool(16)
for result in pool.imap_unordered(target_fnc, some_args):
with open(result) as f:
for element in f:
yield element
Очевидно, что если ваши результаты могут содержать символы новой строки или не являются строками и т. Д., Вы захотите использовать файл csv
, numpy
и т. Д. Вместо простой текстовый файл, но идея та же.
Тем не менее, даже если это проще, обычно есть преимущества для обработки данных по частям за раз, поэтому разбивка ваших задач или использование Queue
(как предлагают два других ответа) может быть лучше, если недостатки (соответственно, необходимость разбить задачи или иметь возможность использовать данные так же быстро, как они создаются) не являются нарушителями соглашения.
Я использовал Apache Commons StringEscapeUtils.unescapeHtml4 () для этого:
Отменяет экранирование строки, содержащей объект экранирует строку, содержащую фактические символы Unicode соответствующие побегам. Поддерживает Сущности HTML 4.0.