1

2 つの関数を並行して実行したい。これらの関数は、ループ内で何度も実行されます。これが私のコードです:

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

次の 2 つの主な事項があります。

1/ ページの HTML コンテンツを取得します。 url_rental=BeautifulSoup(urllib.urlopen(rentals[rental_num]))

2/ 前のページの html コンテンツからデータを取得して保存します (これら 2 つのプロセスが依存するため、現在のページではありません)。 writer.writerow(get_data_rental(previous_url_rental))

これらの 2 行を並行して実行したいと思います。最初のプロセスはページの html コンテンツをn+1取得し、2 番目のプロセスはページのデータを取得して保存しますn。これまでにこの投稿を検索して見つけました: Python: How can I run python functions in parallel? . でも使い方がわからない!

お時間をいただきありがとうございます。

4

2 に答える 2

1

Python の標準 Threading モジュールに興味があるのではないでしょうか? 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 がダウンロードされると、リストまたはキューに追加できます。次に、2 番目のプロセスに、処理する新しいページがあることを通知できます。

于 2013-11-11T13:04:29.807 に答える
1

Python で関数を並行して (つまり、複数の CPU で) 実行するには、Multiprocessing Moduleを使用する必要があります。

ただし、これがたった 2 つのインスタンスのために努力する価値があるとは思えません。

2 つ以上のプロセスを並行して実行できる場合は、上記のモジュールの Pool クラスを使用してください。ドキュメントに例があります。

プール内の各ワーカーは、1 つのページからデータを取得して保存し、次のジョブをフェッチします。ただし、ライターは複数の書き込みを同時に処理できなければならないため、これは簡単ではありません。そのため、書き込みをシリアル化するためにキューも必要になる場合があり、各ワーカーはページを取得し、情報を抽出し、ライターが処理できるように結果をキューに送信します。

于 2013-11-11T10:49:30.047 に答える