Python多处理 - 按需使用工作程序

时间:2017-10-19 10:09:28

标签: python multiprocessing pool

我想解析一个有多个页面的网站。

我不知道页数。 这是原始代码:

        next_button=soup.find_all('a',{'class':"btn-page_nav right"})
        while next_button:
            link=next_button[0]['href']
            resp=requests.get('webpage+link)
            soup=BeautifulSoup(resp.content)
            table=soup.find('table',{'class':'js-searchresults'})
            body=table.find('tbody')
            rows=body.find_all('tr')
            function(rows)
            next_button=soup.find_all('a',{'class':"btn-page_nav right"})

它工作正常,function(rows)是一个解析每个页面的一部分的函数。

我想要做的是使用multiprocessing来解析这些页面。我考虑过使用pool 3个工作人员,这样我就可以同时处理3个页面,但我无法弄清楚如何实现它。

一个解决方案就是:

rows_list=[]
next_button=soup.find_all('a',{'class':"btn-page_nav right"})
while next_button:
    link=next_button[0]['href']
    resp=requests.get('webpage+link)
    soup=BeautifulSoup(resp.content)
    table=soup.find('table',{'class':'js-searchresults'})
    body=table.find('tbody')
    rows=body.find_all('tr')
    rows_list.append(rows)
    next_button=soup.find_all('a',{'class':"btn-page_nav right"})

等待程序遍历所有页面然后:

pool=multiprocessing.Pool(processes=4)
pool.map(function,rows_list)

但是我不认为这会增加太多的性能,我希望主要过程循环遍历页面,一旦打开页面,就将其发送给工作人员。 如何做到这一点?一个虚拟的例子:

pool=multiprocessing.Pool(processes=4)

next_button=soup.find_all('a',{'class':"btn-page_nav right"})
while next_button:
    link=next_button[0]['href']
    resp=requests.get('webpage+link)
    soup=BeautifulSoup(resp.content)
    table=soup.find('table',{'class':'js-searchresults'})
    body=table.find('tbody')
    rows=body.find_all('tr')

    **pool.send_to_idle_worker(rows)**

    next_button=soup.find_all('a',{'class':"btn-page_nav right"})

1 个答案:

答案 0 :(得分:0)

您可以使用Pool.apply_async()代替Pool.map()吗? Apply_async不会阻止,并允许主程序继续处理更多行。它也不需要您的主程序准备好映射所有数据。您只需将一个块作为参数传递给apply_async()