2016-11-03 6 views
0

id_listというデータがこの形式の関数[(u'SGP-3630', 1202), (u'MTSCR-534', 1244)]に入っています。フォーマットは2つの値がペアになっているので、1ペアまたは100ペアが可能です。この関数でマルチスレッドを実装するもっとも簡単な方法[Python]

これは、関数である:

def ListParser(id_list): 
    list_length = len(id_list) 
    count = 0 
    table = "" 

    while count < list_length: 
     jira = id_list[count][0] 
     stash = id_list[count][1] 
     count = count + 1 
     table = table + RetrieveFromAPI(stash, jira) 

    table = TableFormatter(table) 
    table = TableColouriser(table) 

    return table 

何この関数が行うことは、リストを経て、ペアを抽出し、URLから情報を取り出しRetrieveFromAPI()という関数を介してそれらを置くています。

誰でも、ここでマルチスレッド化する方法を知っていますか?私は自分のリストに両方のリストを分割し、各リストを反復するためにプールを取得することができましたが、それはあまり効果がありません。

def ListParser(id_list): 
    pool = ThreadPool(4) 
    list_length = len(id_list) 
    count = 0 
    table = "" 
    jira_list = list() 
    stash_list = list() 

    while count < list_length: 
     jira_list = jira_list.extend(id_list[count][0]) 
     print jira_list 
     stash_list = stash_list.extend(id_list[count][1]) 
     print stash_list 
     count = count + 1 

    table = table + pool.map(RetrieveFromAPI, stash_list, jira_list) 
    table = TableFormatter(table) 
    table = TableColouriser(table) 

    return table 

私はこの試みのために取得していますエラーがTypeError: 'int' object is not iterable

EDIT 2:わかりましたので、私は2つの異なるリストに分割タプルとの最初のリストを取得するために管理してきましたが、私はわかりませんよマルチスレッド化の仕組み

jira,stash= map(list,zip(*id_list))

+1

あなたはそれが機能していないとはどういう意味ですか?何が起こった? –

+0

@EamonnMcEvoyはメインポストにエラーを追加したばかりです –

答えて

1

あなたはあまりにもハード作業しています! help(multiprocessing.pool.ThreadPool)

map(self, func, iterable, chunksize=None) 
    Apply `func` to each element in `iterable`, collecting the results 
    in a list that is returned. 

から二番目の引数を使用すると、ワーカースレッドに渡す引数の反復可能です。あなたはリストのリストを持っていて、各コールの内側リストの最初の2つのアイテムが必要です。 id_listはすでにiterableなので、私たちは近いです。小さな関数(この場合はlambdaとして実装されています)がギャップを橋渡しします。

私は完全なモックソリューションを試してみました。あなたはI/Oを待っている時間の大半を費やすので、プールサイズがかなり大きいというメリットがあります。

from multiprocessing.pool import ThreadPool 

def RetrieveFromAPI(stash, jira): 
    # boring mock of api 
    return '{}-{}.'.format(stash, jira) 

def TableFormatter(table): 
    # mock 
    return table 

def TableColouriser(table): 
    # mock 
    return table 

def ListParser(id_list): 
    if id_list: 
     pool = ThreadPool(min(12, len(id_list))) 
     table = ''.join(pool.map(lambda item: RetrieveFromAPI(item[1], item[0]), 
      id_list, chunksize=1)) 
     pool.close() 
     pool.join() 
    else: 
     table = '' 
    table = TableFormatter(table) 
    table = TableColouriser(table) 
    return table 

id_list = [[0,1,'foo'], [2,3,'bar'], [4,5, 'baz']] 

print(ListParser(id_list)) 
+0

これはすばらしく、私はそれを試してみたところ、すべてがうまくいっているように見えますが、それから私は打撃を受けています。 'ValueError:プロセス数は少なくとも1でなければなりません。 '私はそれを確認/試してみるべきことは何でも? –

+0

さて、ThreadPool()を4に設定するだけで問題は解決したようですが、最適化されていないバージョンがあると思います。しかし、助けてくれてありがとう、それは動作します! –

+0

ValueErrorは、空の 'id_list'を渡すと起こります。チェックするコードを更新しました。私はちょうど帽子から12を引っ張りました...私の直感があなたが4つ以上の要求を同時に動かすことができるということを除いて、それについて特別なことは何もありません。実数(問題がある場合でも)は、実験や微調整が必​​要です。 – tdelaney

関連する問題