Как использовать miltiprocessing для цикла?

1

Я пытаюсь понять, как я могу реализовать многопроцессорность в моем случае. У меня есть две функции: def all_url() и def new_file(). Первый возвращает список, содержащий множество элементов. Второй использует этот список для цикла "for". Я хочу сделать многопроцессор для второй функции new_file(), потому что список, который возвращается из all_url(), слишком велик.

Пример кода:

def all_url():
   #Here I append elements to urllist
    return urllist

def new_file():
    for each in all_url():
      #There a lot of code. Each iteration of loop creates a new html file.

new_file()
  • 0
    Возможно, вам стоит взглянуть на шаблон генератора в Python . Но суть его заключается в реализации функции __next __ (), которая возвращает следующий элемент.
Теги:
multiprocessing
python-multiprocessing

2 ответа

1
Лучший ответ

Вам нужно будет сделать что-то вроде этого:

from multiprocessing.pool import Pool

def all_url():
    #Here I append elements to urllist
    return urllist

def new_file():
    with Pool() as pool:
        pool.map(new_file_process_url, all_url())

def new_file_process_url(each):
      # Creates html file.

if __name__ == '__main__':
    new_file()
  • 0
    Я получил сообщение об ошибке: RuntimeError: Предпринята попытка запустить новый процесс до того, как текущий процесс завершит свою фазу начальной загрузки. Это, вероятно, означает, что вы не используете fork для запуска своих дочерних процессов, и вы забыли использовать правильную идиому в основном модуле: if name == ' main ': freeze_support () ... Строка "freeze_support ()" может быть опущен, если программа не будет заморожена для создания исполняемого файла.
  • 0
    @SBrain Ах да, вы должны обернуть точку входа вашей программы в if __name__ == '__main__': (см. Этот вопрос ). Я обновил ответ.
Показать ещё 2 комментария
0

Не уверен, действительно ли вам нужна потоковая передача, потому что вам нужно подождать, когда будет создан огромный список. Определите функцию all_url как генератор и вызовите его, когда это необходимо.

def all_url():
    yield url # not urllist

url = all_url()

def new_file():
    current_url = next(url)
    # Do the rest 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню