Python Multiprocessing.Pool lazy iteration

Насколько я знаю null луг переменная сразу, прежде чем это оставит объем, не имеет никакого значения к сборщику "мусора".

, Конечно, там случаи, где это действительно помогает. Например, когда var не локальная переменная, а участник или статический участник. Тогда уничтожение ссылки могло бы сделать объект недостижимым и таким образом имеющим право на набор.

Другой случай, где могло бы помочь даже с локальными переменными, если функция выделяет много временной памяти для инициализации некоторых данных для последующей обработки и может выбросить все ссылки на временную память прежде, чем начать обработку:

SomeResult SomeFunction(SomeClass param) {
    TempData big = new TempData(param);
    IntermediateResult intermediate = big.GetIntermediateResult();
    big = null; // allow GC to reclaim the memory before returning from the function
    intermediate.FurtherProcessing();
    return intermediate.EvenMoreProcessing();
}
56
задан Gabe 15 March 2011 в 22:39
поделиться

1 ответ

В этом примере (см. код), 2 рабочих.

работа Пула как ожидалось: когда рабочий свободен, затем чтобы сделать следующее повторение.

Этот код как код в теме, кроме одной вещи: размер аргумента = 64 К.

64 К - значение по умолчанию снабжают размер буфера сокетом.

import itertools
from multiprocessing import Pool
from time import sleep


def f( x ):
    print( "f()" )
    sleep( 3 )
    return x


def get_reader():
    for x in range( 10 ):
        print( "readed: ", x )
        value = " " * 1024 * 64 # 64k
        yield value


if __name__ == '__main__':

    p = Pool( processes=2 )

    data = p.imap( f, get_reader() )

    p.close()
    p.join()
1
ответ дан 26 November 2019 в 17:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: