Пауза Python Generator - PullRequest
       15

Пауза Python Generator

3 голосов
/ 09 августа 2011

У меня есть генератор Python, который работает, который производит большой объем данных, который использует много оперативной памяти. Есть ли способ определить, были ли обработанные данные «использованы» кодом, использующим генератор, и, если это так, приостановить их использование?

def multi_grab(urls,proxy=None,ref=None,xpath=False,compress=True,delay=10,pool_size=50,retries=1,http_obj=None):
    if proxy is not None:
        proxy = web.ProxyManager(proxy,delay=delay)
        pool_size = len(pool_size.records)
    work_pool = pool.Pool(pool_size)
    partial_grab = partial(grab,proxy=proxy,post=None,ref=ref,xpath=xpath,compress=compress,include_url=True,retries=retries,http_obj=http_obj)
    for result in work_pool.imap_unordered(partial_grab,urls):
        if result:
            yield result

пробег от:

if __name__ == '__main__':
    links = set(link for link in grab('http://www.reddit.com',xpath=True).xpath('//a/@href') if link.startswith('http') and 'reddit' not in link)
    print '%s links' % len(links)
    counter = 1
    for url, data in multi_grab(links,pool_size=10):
        print 'got', url, counter, len(data)
        counter += 1

Ответы [ 4 ]

8 голосов
/ 09 августа 2011

Генератор просто выдает значения. Для генератора нет возможности узнать, что с ними делают.

Но генератор также постоянно останавливается, так как вызывающий абонент делает все, что он делает. Он не выполняется снова, пока вызывающая сторона не вызовет его, чтобы получить следующее значение. Он не работает в отдельном потоке или что-то еще. Похоже, у вас неправильное представление о том, как работают генераторы. Можете показать какой-нибудь код?

2 голосов
/ 09 августа 2011

Задача генератора в Python - избавляться от лишних ненужных объектов после каждой итерации. Единственный раз, когда он будет хранить эти дополнительные объекты (и, следовательно, дополнительный оперативный памяти), это когда на объекты ссылаются где-то еще (например, добавление их в список). Убедитесь, что вы не сохраняете эти переменные без необходимости.

Если вы имеете дело с многопоточностью / обработкой, то, возможно, вы захотите внедрить очередь, из которой вы могли бы извлекать данные, отслеживая количество задач, которые вы обрабатываете.

0 голосов
/ 09 августа 2011

Решением может быть использование Queue, к которому генератор будет добавлять данные, тогда как другая часть кода будет получать данные из них и обрабатывать их.Таким образом, вы можете убедиться, что в памяти одновременно находится не более n элементов.

0 голосов
/ 09 августа 2011

Я думаю, вы можете искать функцию yield. Объяснено в другом вопросе StackOverflow: Что делает ключевое слово yield в Python?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...