2017-04-14 5 views
1

私は与えられたデータセットに2つの隣接する要素を持つ特定の関数を適用しようとしています。以下の例を参照してください。例えばマルチタスクは一度にPythonで

# I'll just make a simple function here. 
# In my real case, I send request to database 
# to get the result with two arguments. 

def get_data_from_db_with(arg1, arg2): 
    # write a query with arg1 and arg2 named 'query_result' 
    return query_result 

data = [arg1, arg2, arg3, arg4] 
result = [] 
for a, b in zip(data, data[1:]): 
    result.append(get_data_from_db_with(a, b)) 

上記見場合のように、データの長さが4である場合、私は、データベースへの要求を3回送信します。各要求は、データの検索に約0.3秒かかるため、合計で0.9秒(0.3秒* 3要求)です。問題は、リクエストの数が増えるにつれて、全体の時間も増加することです。私がしたいことは、可能であれば、すべてのリクエストを一度に送信することです。基本的には、このように見えます。上記のコードで

1) get_data_from_db_with(arg1, arg2) 
2) get_data_from_db_with(arg2, arg3) 
3) get_data_from_db_with(arg3, arg4) 

を連続して処理されるであろう。


可能であれば、一度にすべてのリクエストを連続して送信することはできません。もちろん、要求の数は変わりません。しかし、全体的な時間消費は私の前提に基づいて減少します。

私は非同期、マルチプロセッシングなどを探しています。 コメントやフィードバックは非常に役に立ちます。

ありがとうございます。

答えて

2

スレッドはおそらくあなたが探しているものです。ジョブのほとんどがget_data_from_db_withがデータベースを呼び出すのと同じようにI/Oを待っていると仮定します。

import threading 

def get_data_from_db_with(arg1, arg2): 
    # write a query with arg1 and arg2 named 'query_result' 
    current_thread = threading.current_thread() 
    current_thread.result = query_result 

data = [arg1, arg2, arg3, arg4] 
threads = [] 
for a, b in zip(data, data[1:]): 
    t = threading.Thread(target=get_data_from_db_with, args=(a,b)) 
    t.start() 
    threads.append(t) 

results = [] 
for t in threads: 
    t.join() 
    results.append(t.result) 

この解決策でも、resultsリストの順序を保持することに注意してください。

+0

あなたのアドバイスありがとう! 'threading'の使用に関する質問があります。 私が知る限り、PythonはGIL(グローバルインタプリタロック)を与えられたマルチスレッドよりもマルチプロセッシングを好んでいます。 私は間違っているかもしれませんが、ちょうど興味がありました。 –

+0

@GeeYeolNahmそれはあなたが何をしようとしているかによってまったく異なります。 GILはすべてのI/O上でリリースされるので、大部分の時間(CPU集約的なタスクのinsted)でスレッドがプロセスよりも優先される限り、リリースされます。 – freakish

+0

私はマルチスレッドのテストを試みました。それは平均で2〜3倍速くなった。うんうん、私の作業環境でこのケースでマルチスレッドが動作しました。もう一度、ありがとう! –

1

マルチプロセスの代わりに、クエリ構築自体を行うことができます。クエリーを組み合わせる方法を探してみてください。(arg1 and arg2) or (arg2 and arg3)...のように、基本的に1回の呼び出しですべての必要なデータを取得しようとします。

+0

あなたの考えを共有してくれてありがとう。はい、あなたが言及したように1つのリクエストを送信して検索しました。私はまだ1つ1つのクエリを書いて、結果を解析することに取り組んでいます。私は[elasticserach multisearch API](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-multi-search.html)を使用しています。 とりわけ、1つのリクエストを複数のリクエストを同時に送信することより優れていると思います! –

関連する問題