使用多处理池运行不同的任务

时间:2019-10-27 14:07:54

标签: python threadpool python-multiprocessing

我正在用python写一个代码,该代码想获取所有在一个url中建立的链接,将它们另存为key:value对(url:[links]),然后遍历这些链接并在&上做同样的事情直到我得到足够的钥匙。

我已经使用线程列表完成了此操作,并在线程运行完毕后将其从列表中删除,但是我想使用线程池来简化维护

为此,我提供2个功能:

  1. 从网址中获取内容并返回

  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 :(得分:0)

您的问题似乎是从URL生成内容,然后将在URL中找到的链接作为键进行处理,还计划对这些链接进行处理,但是使用线程池和信号量对象并行进行。

如果是这样,我将为您提供信号量对象和线程池的this article

另外,您的问题对我来说听起来很像可以从生产者-消费者体系结构中受益的事物,因此我也建议使用this article