Запускать разные задачи с помощью многопроцессорного пула - PullRequest
0 голосов
/ 27 октября 2019

Я пишу код на python, который предполагает, что все ссылки, основанные на одном URL-адресе, сохраняются в виде пар ключ: значение (url: [ссылки]), а затем просматривают эти ссылки и делают то же самое с &до тех пор, пока у меня не будет достаточно ключей.

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

Для этого я делаю 2 функции:

  1. получить контент из URL и вернуть его

  2. извлечь ссылки из контента и вернутьих

Теперь я хочу управлять этими задачами с помощью пула потоков, но я не знаю, как это сделать правильно, потому что я не знаю, как управлять потоком. Я могу извлечь ссылки только после того, как запрос get вернул html-страницу.

Вот функции, которые я буду использовать:

def extract_links(response):
    arr_starts = [m.start() for m in re.finditer('href="https://', response.content)]
    arr_ends = []
    links = []
    for start in arr_starts:
        end_index = response.content.find('"', start + 6)
        arr_ends.append(end_index)
    for i in range(len(arr_starts)):
        link = response.content[arr_starts[i] + 6:arr_ends[i]]
        links.append(link)


def get_page(url):
    return requests.get(url)

, и это код, который я сделал в первый раз:

first_url = r'https://blablabla'
    hash_links = {}
    thread_list = []
    web_crawl(first_url, hash_links)
    while len(hash_links.keys()) < 30:
        if len(thread_list) < MAX_THREAD_COUNT:
            for urls in hash_links.values():
                for url in urls:
                    if url not in hash_links:
                        new_tread = threading.Thread(target=web_crawl, args=(url, hash_links))
                        thread_list.append(new_tread)
                        new_tread.start()
                        new_tread.join()
        else:
            for t in thread_list:
                if not t.isAlive():
                    t.handled = True
            thread_list = [t for t in thread_list if not t.handled]
    for key in hash_links.keys():
        print key + ':'
        for link in hash_links[key]:
            print '----' + link
``

1 Ответ

0 голосов
/ 27 октября 2019

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

Если это так, я бы указал на эту статью для объектов семафоров и пула потоков.

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

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