2016-11-17 4 views
2

Я создал простую программу python, которая сбрасывает мой любимый сайт рецептов и возвращает отдельные URL рецептов с основного сайта. Хотя это относительно быстрый и простой процесс, я попытался масштабировать его, чтобы очистить несколько веб-страниц внутри сайта. Когда я это делаю, требуется около 45 секунд, чтобы очистить все URL-адреса рецептов со всего сайта. Я бы хотел, чтобы этот процесс был намного быстрее, поэтому я попытался реализовать потоки в моей программе.простая многопоточность в python 3

Я понимаю, что здесь что-то не так, потому что каждый поток возвращает всю цепочку URL-адресов снова и снова, а не «разделяет» работу. Есть ли у кого-нибудь предложения о том, как лучше реализовать потоки? Я включил свою работу ниже. Использование Python 3.

from bs4 import BeautifulSoup 
import urllib.request 
from urllib.request import urlopen 
from datetime import datetime 
import threading 

from datetime import datetime 

startTime = datetime.now() 

quote_page='http://thepioneerwoman.com/cooking_cat/all-pw-recipes/' 
page = urllib.request.urlopen(quote_page) 
soup = BeautifulSoup(page, 'html.parser') 

all_recipe_links = [] 

#get all recipe links on current page 
def get_recipe_links(): 
    for link in soup.find_all('a', attrs={'post-card-permalink'}): 
     if link.has_attr('href'): 
      if 'cooking/' in link.attrs['href']: 
       all_recipe_links.append(link.attrs['href']) 

    print(datetime.now() - startTime) 
    return all_recipe_links 


def worker(): 
    """thread worker function""" 
    print(get_recipe_links()) 
    return 

threads = [] 
for i in range(5): 
    t = threading.Thread(target=worker) 
    threads.append(t) 
    t.start() 
+1

Ваши рабочие потоки просто пытаются очистить 'quote_page' снова и снова. Что вы подразумеваете под разделением работы? – dvnguyen

ответ

1

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

all_recipe_links = [] 
links_to_process = [] 

def worker(): 
    """thread worker function""" 
    while(len(links_to_process) > 0): 
     link = links_to_process.pop() 
     if link.has_attr('href'): 
       if 'cooking/' in link.attrs['href']: 
        all_recipe_links.append(link.attrs['href'])   

threads = [] 
links_to_process = soup.find_all('a', attrs={'post-card-permalink'}) 
for i in range(5): 
    t = threading.Thread(target=worker) 
    threads.append(t) 
    t.start() 

while len(links_to_process)>0: 
    continue 
print(all_recipe_links) 

Я запускал новые методы несколько раз, и в среднем он занимает 0,20 секунды, чтобы запустить это.

+1

Большое вам спасибо. Это работало как прелесть. Я ценю, что вы нашли время, чтобы помочь мне! – Mir

Смежные вопросы