2017-12-20 13 views
1

テーブルからN個のレコードを取り、そのレコードをマルチスレッドで処理するスクリプトを作成しています。リストをN個のリストに分割し、各リストをマルチスレッドの作業者に割り当てます

以前は、各作業者定義内のSQL文でOrder by RAND()を使用し、重複がないことを期待していました。

作品のこの種の(重複除去は後で実行される)、しかし、私はで私のスクリプトをより効率的にしたいと思います:、一度テーブルを照会

1) Nのレコードを抽出し、それらを割り当てますリスト

2)を介して実現することができますYリストの〜同じサイズのリストの中に大きなリストを分割:

number_of_workers = 2 
first_names = ['Steve', 'Jane', 'Sara', 'Mary','Jack'] 
def chunkify(lst,n): 
    return [lst[i::n] for i in xrange(n)] 
list1 = chunkify(first_names, number_of_workers) 
print list1 

3)マルチスレッドでワーカー関数を定義するときは、各ワーカーに異なるサブリストを渡します。注 - 作業者(およびクエリ結果を分割したい部分)の数は、関数の最初に定義されます。 しかし、私はかなり新しいPythonですので、各サブリストを別の作業者に渡す方法はわかりません(またはそれは実行可能ですか?)
助け、他の提案などが大歓迎です!

マルチスレッドコードの例を以下に示します。どうすればいいですか

import threading 
import random 

def worker(): 

    assign sublistN to worker N 
    print sublistN 

threads = [] 
for i in range(number_of_workers): 
    print i 
    print "" 
    t = threading.Thread(target=worker) 
    threads.append(t) 
    t.start() 

ありがとうございました!

答えて

1

2つのこと:

まず、Queueオブジェクトを見てみましょう。このようにリストを分割する必要はありません。これは、複数のスレッド間でオブジェクトのコレクションを分割するために使用されます(複数のプロセスのバリエーションもありますが、ここではこれが得られます)。ドキュメントには、要件に合った非常に良い例が含まれています。

第2に、あなたの労働者がIOのようなものを待つことを必要としない限り、ネットワークリクエストなどはPythonでのスレッド化は、順番に処理するよりも早くなく(おそらく実際は遅いでしょう)。スレッディングはマルチプロセッシングを使用せず、一度に実行できるスレッドは1つだけです。これが当てはまる場合は、おそらくMultiprocessingが実際に動作するためには全く新しいPythonプロセスをスピンする必要があります。 queuesなどの類似のツールがあります。

+0

ありがとうございました。待ち行列を調べます。 スレッディングに関しては、私はスクレイピングスクリプトを作成しています。ボトルネックはプロキシ経由のネットワーク/リクエストであるため、スレッド処理は単一のCPUコアがトップになるまで処理速度を上げるようです。 私はマルチプロセッシングについて素晴らしいことを読んだことがありましたが、動作させることができませんでした。私の推測は、jupyterノートブック経由でコードを実行しているからです。一度良くなると、私は別のショットをマルチプロセッシングし、すべてのコアをうまく​​利用できるようになります:) – FlyingZebra1

1

SCBが述べたように、これはqueを利用することで解決されました。 名前のリストを取る - >各ワーカー(2人の労働者)に名前を渡すという簡単な例があります - >各ワーカーは与えられた名前を単純に印刷します。

from Queue import Queue 
from threading import Thread 
from time import sleep 
first_names = ['Steve', 'Jane', 'Sara', 'Mary','Jack','tara','bobby'] 


q = Queue(first_names) 
num_threads = 2 

def do_stuff(q): 
    while True: 
     print q.get() 
     sleep(1) 
     q.task_done() 



for i in range(num_threads): 
    worker = Thread(target=do_stuff, args=(q,)) 
    worker.start() 

for x in first_names: 
    q.put(x) 

q.join() 

コードはhereに適合しています。

関連する問題