python:并行运行函数

时间:2013-11-11 10:42:46

标签: python parallel-processing

我想并行运行两个函数。这些函数在循环中执行多次。 这是我的代码:

#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内容中检索并保存数据(而不是当前页面,因为这两个进程是相关的): writer.writerow(get_data_rental(previous_url_rental))

我想并行运行这两行:第一个进程将获取页面n+1的html内容,而第二个进程将检索并保存页面n的数据。 到目前为止,我已经搜索并发现了这篇文章:Python: How can I run python functions in parallel?。但我不明白如何使用它!

感谢您的时间。

2 个答案:

答案 0 :(得分:1)

为了在Python中并行运行函数(即在多个CPU上),您需要使用Multiprocessing Module

但是,我怀疑只有两个实例才值得努力。

如果您可以并行运行两个以上的进程,请使用所述模块中的Pool类,文档中有一个示例。

池中的每个工作人员都会从一个页面检索并保存数据,然后获取下一个要执行的工作。但是这并不容易,因为您的编写器必须能够同时处理多个写入。因此,您可能还需要一个队列来序列化写入,每个工作人员只需检索页面,提取信息并将结果发送到队列以供编写者处理。

答案 1 :(得分:1)

也许python的标准线程模块对你有意义? 使用像Ber这样的队列对我来说似乎是件好事。

这样我使用Threading库(没有Queue),你可以使用Queue扩展它,如果你想:

#!/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后,可以将其添加到列表或队列中。然后可以通知第二个过程,即要处理新页面。