Используя wget с помощью Python [дубликат]

Прочитайте следующие статьи о управлении памятью Python:

Python: Управление памятью

Exerpt: (примеры можно найти в статье):

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

На самом низком уровне распределенный источник памяти обеспечивает достаточное пространство в частной куча для хранения всех связанных с Python данных, взаимодействуя с менеджером памяти операционной системы. В дополнение к распределенному распределителю памяти несколько объектно-ориентированных распределителей работают в одной и той же куче и реализуют различные политики управления памятью, адаптированные к особенностям каждого типа объекта. Например, целые объекты управляются по-разному в куче, чем строки, кортежи или словари, потому что целые числа подразумевают разные требования к хранению и компромиссы между скоростью и пространством. Таким образом, диспетчер памяти Python делегирует часть работы объектно-ориентированным распределителям, но гарантирует, что последние работают в рамках частной кучи.

Важно понимать, что управление кучей Python выполняется самим интерпретатором и что пользователь не контролирует его, даже если она регулярно манипулирует указателями объектов на блоки памяти внутри этой кучи. Выделение кучного пространства для объектов Python и других внутренних буферов выполняется по требованию менеджером памяти Python с помощью функций API Python / C, перечисленных в этом документе.

blockquote>

29
задан CoreIs 18 March 2010 в 04:55
поделиться

4 ответа

Нет причин использовать os.system. Избегайте написания сценария оболочки на Python и используйте что-то вроде urllib.urlretrieve или его эквивалента.

Редактировать ... чтобы ответить на вторую часть вашего вопроса, вы можете настроить пул потоков с помощью стандартной библиотеки Queue class. Поскольку вы много скачиваете, GIL не должен быть проблемой. Создайте список URL-адресов, которые вы хотите загрузить, и направьте их в свою рабочую очередь. Он будет обрабатывать запросы на отправку в рабочие потоки.

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


#!/usr/bin/python

import sys
import threading
import urllib
from Queue import Queue
import logging

class Downloader(threading.Thread):
    def __init__(self, queue):
        super(Downloader, self).__init__()
        self.queue = queue

    def run(self):
        while True:
            download_url, save_as = queue.get()
            # sentinal
            if not download_url:
                return
            try:
                urllib.urlretrieve(download_url, filename=save_as)
            except Exception, e:
                logging.warn("error downloading %s: %s" % (download_url, e))

if __name__ == '__main__':
    queue = Queue()
    threads = []
    for i in xrange(5):
        threads.append(Downloader(queue))
        threads[-1].start()

    for line in sys.stdin:
        url = line.strip()
        filename = url.split('/')[-1]
        print "Download %s as %s" % (url, filename)
        queue.put((url, filename))

    # if we get here, stdin has gotten the ^D
    print "Finishing current downloads"
    for i in xrange(5):
        queue.put((None, None))

9
ответ дан McJeff 28 November 2019 в 01:28
поделиться

Нет причин использовать Python. Избегайте написания сценария оболочки на Python и используйте что-то вроде bash или эквивалентного ему.

-5
ответ дан davr 28 November 2019 в 01:28
поделиться

Не делайте этого. Используйте urllib2 или urlgrabber вместо этого.

19
ответ дан 28 November 2019 в 01:28
поделиться

Если вы используете os.system() для порождения процесса для wget, он будет блокироваться, пока wget не закончит загрузку (или не выйдет с ошибкой). Поэтому просто вызывайте os.system('wget blah') в цикле, пока не скачаете все файлы.

В качестве альтернативы вы можете использовать urllib2 или httplib. Вам придется написать нетривиальный объем кода, но производительность будет выше, так как вы сможете использовать одно HTTP-соединение для загрузки многих файлов, в отличие от открытия нового соединения для каждого файла.

10
ответ дан 28 November 2019 в 01:28
поделиться
Другие вопросы по тегам:

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