2017-08-14 7 views
0

私は次の問題があります。私はマルチスレッドを使用してAPI呼び出しを処理するために私のコードをリファクタリングしようとしています。私は写真のペアを必要とするAPIを介してLSTリストを受け取り使用して、それを処理タプルのリストのPython pool.map

lst = [('/Users/sth/photo1.jpg', 
     '/Users/sth/photo2'), 
     ('/Users/sth/photo1.jpg', 
     '/Users/sth/photo3'), (...)] 

機能:私のコア・データは、次の形式でタプルの単純なリストです。結局のところ、各ペアに対して単一の番号が返されます。これまでは、ループを使用して関数にタプルを入れ、前述の数を生成しています。私は、1つのプロセスが私のリストの一部を取り、バッチ内のタプルの関数を呼び出すという方法で全体の並列化を並列化したいと思います。私はマルチプロセッシングモジュール用のプール機能を使用しようとしていたことを行うには:

from multiprocessing.dummy import Pool as ThreadPool 
pool = ThreadPool(2) 
results = pool.map(score_function, lst) 

ただし、次のエラーが発生します。奇妙な

IOError: [Errno 2] No such file or directory: 'U' 

何かがここで起こっています。私のタプルの1文字を引数として扱います。任意のアイデアを正しく行う方法?

はあなたが

@editありがとう

score_function定義の欠如は私の悪いです。私は質問を更新してみましょう:

def score_function(pairs): 
    score_list = list() 

    for pair in pairs: 
     score = findElement(target = pair[0], source = pair[1]) 
     score_list.append([pair[0], pair[1], score]) 

    return score_list 
findElementは次のように定義されて

:あなたのscore_functionを知り、どのように定義し、アクセスをせずに

def findElement(target, source): 

    with open(source, 'rb') as source_: 
     source_bytes = source_.read() 

    with open(target, 'rb') as target_: 
     target_bytes = target_.read() 

    score = API_request(target_bytes = target_bytes, 
         source_bytes = source_bytes) 
    return score 
+0

あなたのscore_functionも共有できますか?少なくとも定義のような重要な部分はありますが、そこにどのようにパラメータにアクセスしてください。 – Hannu

+0

@Hannuあなたは正しいです。私はscore_function定義を追加しました –

+1

私は別の答えを投稿しました、少し助けてください。 – Hannu

答えて

1

問題はforループです。あなたのタプルを個々の文字列に分割します。これを行うと、それが動作するはずです:

def score_function(pairs): 
    score_list = list() 

    score = findElement(target = pairs[0], source = pairs[1]) 
    score_list.append([pairs[0], pairs[1], score]) 

    return score_list 

は、あなたはおそらく、あなたのscore_functionがパラメータとしてlst変数を受け取ることになると想定。これは起こりません。 lstはあなたの場合のようにリストにする必要があり、pool.mapはそれを個々の要素に自動的に分割し、ちょうど1つの要素をscore_functionに送り、ワーカーがリスト全体を処理するまで続けます。ワーカーに呼び出されるたびに、作業する要素の1つだけがパラメータとして受け取ります。個々の要素はタプル(path1、path2)です。このタプルでforを呼び出すと、ループ内に単一のパス(文字列)が1つだけ表示され、ペア[1]はこの文字列の2番目の文字になります。

これが役に立ちます。

1

が、私はあなたが

def score_function(param): 
    with open(param[1], "r") as fp: 
     .... 
のようなものを持っていることを推測しますそこに

があります。

paramがタプルではないことを示すエラー(param [1]、paramがタプルの場合は2番目の要素)、param [1](paramが文字列の場合) 2番目の文字、あなたの場合はUから/ユーザー...)。入力してください。

print param 

ありがとうございます。あなたの最初のものはすべて間違っていて括弧がありません。そしてpool.mapはそれを平らにして文字列としてあなたの関数に個々のコンポーネントを送ります。例えばそこのエントリであり、あなたはそれの前後に括弧を挿入するために忘れてしまった場合は、最初の二つが、三分の一を処理することができ(それとして第四だろう

lst = [('/Users/bar/photo1.jpg', '/Users/bar/photo2'), 
     ('/Users/bar/photo2.jpg', '/Users/bar/photo3'), 
     '/Users/bar/photo3.jpg', '/Users/bar/photo4', 
     (...., .....), (...., .....)] 

パラメータとして、個々の文字列を送信しますタプル内の2番目のコンポーネントではなく別のエントリになっています)は、現在取得しているエラーとまったく同じです。いずれにせよ、あなたのscore_functionが受け取るパラメータを印刷することは、あなたの問題がどこにあるかを理解するのに役立ちます。 pool.mapの使用は正しいですし、あなたの入力が期待どおりであることを前提として動作します。

関連する問題