2017-01-24 2 views
1

私は、セレニウムスクリプトを実行するためにPythonマルチプロセッシングライブラリを使用しています。私のコードは以下の通りです:連続ループでPythonマルチプロセッシングプールを使用する方法

#-- start and join multiple threads --- 
thread_list = [] 
total_threads=10 #-- no of parallel threads 
for i in range(total_threads): 
    t = Process(target=get_browser_and_start, args=[url,nlp,pixel]) 
    thread_list.append(t) 
    print "starting thread..." 
    t.start() 

for t in thread_list: 
    print "joining existing thread..." 
    t.join() 

私はjoin()機能を理解できるように、それが完了するために、各プロセスを待ちます。しかし、私は、プロセスがリリースされるとすぐに、新しい機能を実行する別のタスクが割り当てられることを願っています。

これは次のように理解できます。

第1段階では8つのプロセスが開始されました。

no_of_tasks_to_perform = 100 

for i in range(no_of_tasks_to_perform): 
    processes start(8) 
    if process no 2 finished executing, start new process 
    maintain 8 process at any point of time till 
    "i" is <= no_of_tasks_to_perform 

答えて

1

代わりのすべての今して新しいプロセスを開始し、multiprocessing.Queue()にすべてのタスクを入れて、8 長時間実行プロセスを開始し、各プロセスで新しいタスクを取得するためにタスクキューにアクセスして維持しようともう仕事がなくなるまで仕事をしてください。あなたのケースでは

、それはより多くのこのようなものだ:

from multiprocessing import Queue, Process 

def worker(queue): 
    while not queue.empty(): 
     task = queue.get() 

     # now start to work on your task 
     get_browser_and_start(url,nlp,pixel) # url, nlp, pixel can be unpacked from task 

def main(): 
    queue = Queue() 

    # Now put tasks into queue 
    no_of_tasks_to_perform = 100 

    for i in range(no_of_tasks_to_perform): 
     queue.put([url, nlp, pixel, ...]) 

    # Now start all processes 
    process = Process(target=worker, args=(queue,)) 
    process.start() 
    ... 
    process.join() 
+0

それは私のためによく働いた...この設定では8つのプロセッサがある –

+0

@shane @Shaneおかげで、?それは単に 'process.start(8)'だったはずです。私はwebDriverのインスタンスを確立するためにクラスを初期化することができますし、キュー内のパラメータで私のスクレイピング関数を呼び出すカスタムPythonモジュール私はソースがあります。しかし、私はプールに8つのWebDriversをインスタンス化する必要はありません - 私は1つのXウィンドウフレームバッファ(Xvfb)とヘッドレスchromedriverインスタンスが8つの異なるプロセスとして働いて(1000単位で) ? – Ricalsin

+0

この設定では、実際に手動で8つのプロセス(または必要なもの)を手動で起動し、新しいタスクを連続的に取得するために、それぞれ長時間実行するプロセスにします(ブラウザをインスタンス化して処理します)。 'process1 = Process(target = worker、args =(queue、))' ... ... 'process8 ...'です。 'multiprocessing.Pool'を使いたい場合は' map'を使って関数を渡す必要がありますが、実際にはあなたの場合はそれほど便利ではありません。特に複数のパラメータについては、これをチェックしてください。http: //stackoverflow.com/a/5442981/7405394 – Shane

関連する問題