English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Pythonのプロセスの同期とプール化

プロセス間のシンクロナイズ

多重処理は、APIを使用してプログラムを生成するサポートを提供するパッケージです。このソフトウェアパッケージはローカルおよびリモートの並行処理に使用されます。このモジュールを使用すると、プログラマーは指定されたコンピュータ上で複数のプロセッサを使用することができます。それはWindowsおよびUNIXオペレーティングシステム上で実行できます。

このパッケージにはすべての等価なシンクロナイズ原語が含まれています。

例程式コード

from multiprocessing import Process, Lock
   def my_function(x, y):
      x.acquire()
      ('hello world', y)をプリントします
      x.release()
      if __name__ == '__main__':
      lock = Lock()   for num in range(10):
Process(target= my_function, args=(lock, num)).start()

ここでは、インスタンスがロックされることで、一度に1つのプロセスのみが標準出力を表示できることを確保します。

集約

プールにはPoolクラスを使用します。プロセスプールを生成する場合、それが提出されるすべてのタスクを保持します。

class multiprocessing.Pool([processes[, initializer[, initargs[, maxtasksperchild]]]])

プールオブジェクトは、作業プールを選択して提出できるタスクを制御し、タイムアウト、コールバック、並列マッピングを実装したアシスト結果をサポートします。

プロセスが空の場合はcpu_count()を使用し、初期化が非noneの場合はinitializer(* initargs)を呼び出します。

apply(func[, args[, kwds]])

これはapply()内蔵機能と同じです。結果が準備でき次第ブロックし、並列実行にはapply_async()メソッドがより良いです。

apply_async(func[, args[, kwds[, callback]]])

結果オブジェクトを返します。

map(func,可迭代[,chunksize])

map()は、内蔵関数であり、1つの可迭代オブジェクトをサポートしています。結果が準備でき次第ブロックします。

このメソッドでは、可迭代オブジェクトが多くの小さなブロックに分解され、これらの小さなブロックがそれぞれのタスクとしてプロセスプールに提出されます。

map_async(func,iterable [,chunksize [,callback]])

結果オブジェクトを返します。

imap(func,iterable [,chunksize])

itertools.imap()と同じです。

パラメータのサイズは、使用される中で同じです。map()

imap_unordered(func,iterable [,chunksize])

これはimap()イテレータの順序を再設定します。

閉じる()

すべてのタスクが作業プロセスによって完了した後、プロセスはプールから退出します。

終了()

作業プロセスを即座に停止してタスクを完了させない場合は、このメソッドを使用します。

join()

使用する際にjoin()これらのメソッド(terminate()とclose())の前に、close()およびterminate()関数。

クラスmultiprocessing.pool.AsyncResult

Pool.apply_async()とPool.map_async()から返されます。

get([超時])

この関数は到達時に結果を返します。

待機([超時])

この待機機能を使用して、結果が利用可能になるか、またはタイムアウト秒が過ぎるまで待機します。

準備()

この関数はコールが完了したかどうかを返します。

成功()

この関数が正常に終了すると、エラーは発生しません。この関数は戻り値を返します。

例程式コード

# -*- coding: utf-8 -*-
"""
Created on Sun Sep 30 12:17:58 2018
@author: oldtoolbag.com
"""
from multiprocessing import Pool
import time
def myfunction(m):
return m*m
if __name__ == '__main__':
my_pool = Pool(processes=4) # start 4 worker processes
result = my_pool.apply_async(myfunction, (10,)) # evaluate "f(10))" asynchronously in a single process
print (result.get(timeout=1))
print (my_pool.map(myfunction, range(10)) # prints "[0, 1, 4,..., 81]"
my_it = my_pool.imap(myfunction, range(10))
print (my_it.next() ) # prints "0"
print (my_it.next() ) # prints "1"
print (my_it.next(timeout=1) ) # prints "4" unless your computer is *very* slow
result = my_pool.apply_async(time.sleep, (10,))
print (result.get(timeout=1) ) # raises multiprocessing.TimeoutError