Почему многопроцессорный вызывающий код Python не указан? - PullRequest
1 голос
/ 02 ноября 2019

Я пытаюсь реализовать многопроцессорную обработку в моем проекте веб-шифрования для очистки списка из 200 страниц 10 за раз, а не за один раз.

Моя проблема в том, что при реализации кодавызов функции из списка вызывает большой сбой, когда она вызывает операторы ввода вне вызываемой функции.

Вот весь пример сценария, демонстрирующий проблему:

#print statements to request necessary details to perform scrape
cleanURL = input("What is the URL? ")
pn = input("What is the product name? ")
condition = input("Is the product used or new? ").lower()
pages_available = input('How many pages of data do you want? ')

def scrape_page(URL):
    #variables for storing/cleaning data for mysql queries
    headers = {"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Firefox/68.0'}
    page = requests.get(URL, headers=headers)
    soup = BeautifulSoup(page.content, 'html.parser')


#creates a list of 200 urls
url_list = []
for pages_unscraped in range(int(pages_available)+1):
    URL = cleanURL + str(pages_unscraped)
    if (pages_unscraped > 0):
        url_list.append(URL)

#supposed to call the scrape_page function on the entire url_list
if __name__=='__main__':
    p = Pool(10)
    p.map(scrape_page, url_list)
    p.terminate()
    p.join()

Проблема, которая возникает, состоит в том, что она вызывает оператор ввода 10 раз, а не просто вызывает функцию 'scrape_page' для 10 URL-адресов из списка за раз.

Как я могу остановить программирование, чтобы вызватьвопрос

1 Ответ

3 голосов
/ 02 ноября 2019

Вам необходимо поместить весь ваш код «одиночного исполнения» (например, операторы input) либо в область действия if __name__=='__main__': guard, либо в отдельную функцию, которая будет вызываться изнутри защиты, гарантируя толькоодиночное выполнение.

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

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