1

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

#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))

我想并行运行这两行:第一个进程将获取页面的 html 内容,n+1而第二个进程将检索并保存页面的数据n。到目前为止,我已经搜索并找到了这篇文章:Python:如何并行运行 python 函数?. 但是不明白怎么用!

感谢您的时间。

4

2 回答 2

1

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

但是,我怀疑这是否值得为两个实例付出努力。

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

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

于 2013-11-11T10:49:30.047 回答
1

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

这种方式我使用线程库(不带队列),如果您愿意,可以使用队列扩展它:

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

于 2013-11-11T13:04:29.807 回答