2013-11-11 4 views
1

Я хочу запустить две функции параллельно. Эти функции выполняются много раз в цикле. Вот мой код:python: запускать функции параллельно

#get the html content of the first rental 
previous_url_rental=BeautifulSoup(urllib.urlopen(rentals[0])) 

#for each rental on the page 
for rental_num in xrange(1, len(rentals)): 
    #get the html content of the page 
    url_rental=BeautifulSoup(urllib.urlopen(rentals[rental_num])) 
    #get and save the rental data in the csv file 
    writer.writerow(get_data_rental(previous_url_rental)) 
    previous_url_rental=url_rental 

#save last rental 
writer.writerow(get_data_rental(previous_url_rental)) 

Есть две основные вещи:

1/получить содержимое HTML страницы: url_rental=BeautifulSoup(urllib.urlopen(rentals[rental_num]))

2/извлечения и сохранения данных из содержимого HTML в на предыдущей странице (а не на текущей странице, поскольку эти 2 процесса будут зависеть): writer.writerow(get_data_rental(previous_url_rental))

Я бы хотел запустить эти две строки Параллельно: первый процесс получит html-содержимое страницы n+1, а второй процесс будет извлекать и сохранять данные на странице n. Я нашел и нашел этот пост до сих пор: Python: How can I run python functions in parallel?. Но я не понимаю, как его использовать!

Спасибо за ваше время.

+0

Что вы видите, это многопроцессорная обработка, которая имеет долгую историю. Кроме того, почему вы должны делать это параллельно? Вы не можете записать строку, когда вы не получили данные. – aIKid

+0

Вот почему я хочу получить страницу '# n + 1' и в то же время записать данные на странице' # n'. Это возможно? – rom

+0

Насколько велики данные, о которых мы говорим? Сколько страниц? – aIKid

ответ

1

Для запуска параллельных функций (то есть на нескольких процессорах) в Python вам необходимо использовать Multiprocessing Module.

Однако я сомневаюсь, что это стоит усилий только для двух экземпляров.

Если вы можете запускать более двух процессов параллельно, используйте класс Pool из указанного модуля, в документах есть пример.

Каждый рабочий в пуле будет извлекать и сохранять данные с одной страницы, чтобы выполнить следующее задание. Однако это непросто, так как вы, писатель, должны иметь возможность обрабатывать несколько записей одновременно. Таким образом, вам также может понадобиться очередь для сериализации записей, и каждый работник просто извлекает страницы, извлекает информацию и отправляет результат в очередь для записи писателя.

+0

Я вижу, это кажется сложным и может не сэкономить много времени. Я хотел бы попробовать все равно, чтобы увидеть это для себя. Но я не понимаю, как адаптировать примеры из той ссылки, которую вы только что использовали. Можете ли вы применить эти примеры по моей конкретной задаче или показать мне другие примеры? Спасибо. – rom

1

Возможно, вам интересен стандартный модуль Threading python? Использование очереди, как говорит Бер, кажется мне хорошей вещью.

Таким образом, я использую библиотеку Threading (без очереди), вы можете развернуть его с очередью, если вы хотите:

#!/usr/bin/python 

import threading 
from threading import Thread 
import time 

fetch_stop = threading.Event() 
process_stop = threading.Event() 

def fetch_rental(arg1, stop_event): 
    while(not stop_event.is_set()): 
     #fetch content from url and add to Queue 

def process_rental(arg1, stop_event): 
    while(not stop_event.is_set()): 
     #get item(s) from Queue, process them, and write to CSV 


try: 
    Thread(target=fetch_rental, name="Fetch rental", args=(2, fetch_stop )).start() 
    Thread(target=process_rental, name="Process rental", args=(2, process_stop)).start() 
    while True: 
     time.sleep(10) #wait here while the processes run 
except: 
    fetch_stop.set() 
    process_stop.set() 
    exit() 

Теперь вы можете взаимодействовать с процессами с использованием блокировок и событий (см документации) Когда страница #n была загружена, ее можно добавить в список или в очередь. Затем второй процесс может быть проинформирован о том, что новая страница должна быть обработана.

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