我想并行运行两个函数。这些函数在循环中执行多次。 这是我的代码:
#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?。但我不明白如何使用它!
感谢您的时间。
答案 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后,可以将其添加到列表或队列中。然后可以通知第二个过程,即要处理新页面。