Python 学習:multiprocessing モジュール

2014-11-07 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での、blogramのランクインカテゴリは、
5、2、0、1、1、 0、0、0、0、0(41)で、換算ポイント 72pt 。
「Firefox」2日前朝方4位にup。でも昨日朝方5位にdown。
相変わらず「C言語」「Firefox」「化学業界」「グルコサミン」の
bg値が毎日の如く変動。
・-・ - -・

さて、本文。

先月末(2014-10-30)の記事:
Python 学習:os.fork
で、「WinPython」では、“os.fork”は使えないが、
代わりに“multiprocessing”モジュールで相当する機能を実現できる。
ことが分かった。


そこで、前回記事で参照した、日本語のページ:
「Welcome to underground」の
マルチプロセッシング(multiprocessing)
にある、

データ授受に於いて、
一方通行の“Queue”の例:

from multiprocessing import Process, Queue

def f(q):
q.put([42, None, 'hello'])

if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print q.get() # prints "[42, None, 'hello']"
p.join()


を真似て、

from multiprocessing import Process, Queue
import time

def Proc( Q, i, s ):
time.sleep(0.01*i)
Q.put( [ i, len(s) ] )
# Q.put( [ i, len(ST[i]) ] ) # <<<<<<<<<<<<<<< これはダメ!!!

if __name__ == "__main__":
Q = Queue()
ST = [ 'a', 'bb', 'ccc', 'dddd' ]
pp = len(ST); VT = [ 0 ] * pp
for i in range(pp):
p = Process( target=Proc, args=( Q, i, ST[i] ) )
p.start(); p.join()
for i in range(pp):
v = Q.get(); VT[ v[0] ] = v[1]
print( VT ); time.sleep(3)



そして、双方向(渡したり受けたり)出来る“Pipe”の例:

from multiprocessing import Process, Pipe

def f(conn):
conn.send([42, None, 'hello'])
conn.close()

if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
print parent_conn.recv() # prints "[42, None, 'hello']"
p.join()


これも真似をしてみようとしたが、・・・・・

最終段落:“append”
に気になることが書いてある。

どうも、“Manager”クラスを使うべき!?

そこで、本家ドキュメント:「Python 2.7.8 Documentation」の、
16.6. multiprocessing - Process-based“threading”interface」の
「16.6.1.4. Sharing state between processes」にある、

  A manager returned by Manager() will support types list,
   dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore,
   Condition, Event, Queue, Value and Array.

に注目した。

そこにある“Manager()”クラスを使った例を元に、

from multiprocessing import Process, Manager
import time
import numpy as np

def Proc( i, A, s ): # 一般のスカラ、アレイ(戻り値用)、リスト(入力)
time.sleep(0.01*i)
print s[i]
A[i] = len( s[i] )

if __name__ == "__main__":
manager = Manager()
ST = [ 'a', 'bb', 'ccc', 'dddd' ]
pp = len(ST)
s = manager.list( ST ) # 子に渡す=グローバル変数の代わり
A = manager.Array( 'i', [0]*pp ) # 子からの戻り値用
for i in range(pp):
p = Process( target=Proc, args=( i, A, s ) )
p.start(); p.join()
VT = np.array(A)
print( VT ); time.sleep(3)


の様にコーディングした。

一般(?)のスカラ(=Python 変数)に加えて、
“multiprocessing”の“Manager”の、
リストで渡して、アレイで受け取る。

出来ますね。

これで、やりたいことはほぼ何でも出来る!?


本日はここまで。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


141015,17
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
07 | 2017/08 | 09
- - 1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31 - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク