NLP | execnetと並行してリストを処理する

| | | | | | | | | | | | | | | | | | | |

以下のコードでは、整数が単純に2倍になり、クリーンな計算を実行できます。これは、execnetによって実行されるモジュールです。 2つのタプル(i、arg)を受け取り、argを数値と見なして、(i、arg * 2)を送り返します。

コード:

if __ name__ = = `__channelexec__`

for (i、arg) in チャネル:

channel.send((i、arg * 2 ))

使用するにはこのモジュールを使用して、リスト内の各アイテムを2倍にし、 plists モジュールをインポートして、 plists .map()wiを呼び出します。 remote_doubleモジュールとdoubleにする整数のリスト。

コード:plistの使用


import plists、remote_double

plists。 map (remote_double、 range 10 ))

出力:

 [0、2、4、6、8、10、12、14、16、18] 

マップ( )関数はplists.pyで定義されています。純粋なモジュール、引数リスト、およびオプションの(spec、count)の2タプルリストが必要です。デフォルトでは、仕様が使用されます[(' popen&#39 ;, 2)]。これは、ユーザーが2つのローカルゲートウェイとチャネルを開くことを意味します。これらのパイプが開いたら、ユーザーはそれらをitertoolsループに配置できます。これにより、無限のイテレーターが作成され、最後に到達するとすぐに最初に戻ります。

これで、各引数を引数として送信できます。処理のためにパイプに送られ、チャネルは循環的であるため、各チャネルはほぼ等しい引数の分布を受け取ります。そこでが登場しました—結果が返される順序は不明であるため、リスト内の各引数のインデックスとして i がチャネルとの間で受け渡され、ユーザーは結果を元の順序で組み合わせることができます。 。次に、マルチチャネル受信キューで結果を待ち、元の引数と同じ長さの事前入力されたリストにそれらを挿入します。期待されるすべての結果を取得したら、ゲートウェイを終了し、以下のコードに示すように結果を返します—

コード:


import itertools、execnet

def map (mod、args、specs = [( `popen` 2 )]):

ゲートウェイ = []

チャネル = []

for spec、count in specs:

for i in range (count):

gw = execnet.makegateway(spec)

Gateways.append(gw )

channels.append(gw.remote_exec(mod))


cyc = itertools.cycle(channels)


for i、arg in 列挙(args):

チャネル = next (cyc)

channel.send((i、arg))

mch = execnet.MultiChannel(channels)

キュー = mch.make_receive_queue()

l = len (args)

#長さlのリストを作成します。

#各要素はNoneです

結果 = [ なし] * l

for i in range (l):

channel、(i、result) = queue.get()

結果[i] = result

for gw in ゲートウェイ:

gw.exit()

リターン結果

コード:仕様を変更して並列化を増やします


plists。 map (remote_double、 range 10 )、[( `popen` 4 )])

出力:

 [0、2、4、6、8、10、12、14、16、18] 

ただし、並列化がこれ以上行われないということは、必ずしも処理が高速になることを意味します。これは利用可能なリソースに依存し、開いているゲートウェイとチャネルが多いほど、オーバーヘッドが大きくなります。理想的には、リソース使用率を最大化するために、CPUコアごとに1つのゲートウェイとチャネルが必要です。 plists.map()は、2つのタプルを送受信する限り、クリーンなモジュールで使用します。ここで、iは最初の要素です。このパターンは、できるだけ早く処理するために処理する必要のある数値が多数ある場合に最も役立ちます。