Pythonでのマルチプロセッシング
マルチプロセッシングパッケージは、スポーンプロセスをサポートします。これは、新しい子プロセスをロードして実行する関数を指します。子が並行コンピューティングを終了または実行し続けるには、現在のプロセスは、スレッドモジュールと同様のAPIを使用して待機する必要があります。
はじめに
マルチプロセッシングを使用する場合、最初にプロセスを作成します 物体。次に、start()メソッドを呼び出します。
サンプルコード
from multiprocessing import Process def display(): print ('Hi !! I am Python') if __name__ == '__main__': p = Process(target=display) p.start() p.join()
この例では、最初にProcessクラスをインポートしてから、display()関数を使用してProcessオブジェクトを開始します。
次に、start()メソッドを使用してプロセスを開始し、join()メソッドを使用してプロセスを完了します。
argsキーワードを使用して関数に引数を渡すこともできます。
例
from multiprocessing import Process def display(my_name): print ('Hi !!!' + " " + my_name) if __name__ == '__main__': p = Process(target=display, args=('Python',)) p.start() p.join()
この例では、数値の3乗を計算し、すべての結果をコンソールに出力するプロセスを作成します。
サンプルコード
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cube is %s' % (x, x**3)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] p = Process(target=cube, args=('x',)) p.start() p.join print ("Done")
出力
Done 3 cube is 27 4 cube is 64 5 cube is 125 6 cube is 216 7 cube is 343 8 cube is 512
一度に複数のプロセスを作成することもできます。
この例では、最初にprocess1という1つのプロセスを作成します。このプロセスは、数値の3乗を計算すると同時に、2番目のプロセスprocess2は、この数値が偶数または奇数であることを確認します。
例
from multiprocessing import Process def cube(x): for x in my_numbers: print('%s cube is %s' % (x, x**3)) def evenno(x): for x in my_numbers: if x % 2 == 0: print('%s is an even number ' % (x)) if __name__ == '__main__': my_numbers = [3, 4, 5, 6, 7, 8] my_process1 = Process(target=cube, args=('x',)) my_process2 = Process(target=evenno, args=('x',)) my_process1.start() my_process2.start() my_process1.join() my_process2.join() print ("Done")
出力
3 cube is 27 4 cube is 64 5 cube is 125 6 cube is 216 7 cube is 343 8 cube is 512 4 is an even number 6 is an even number 8 is an even number Done
プロセス間の通信
マルチプロセッシングは、プロセス間の2種類の通信チャネルであるパイプとキューをサポートします。
パイプh2>
マルチプロセッシングでは、プロセス間で通信する場合、その状況ではパイプ strong> 使用されます。
例
from multiprocessing import Process, Pipe def myfunction(conn): conn.send(['hi!! I am Python']) conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() p = Process(target=myfunction, args=(child_conn,)) p.start() print (parent_conn.recv() ) p.join()
出力
['hi !!! I am Python']
パイプは2つの接続オブジェクトを返し、これらはパイプの両端を表しています。各接続オブジェクトには2つのメソッドがあります。1つはsend()メソッドで、もう1つはrecv()メソッドです。
この例では、最初にプロセスを作成し、このプロセスは「hi !! I am Python」というメッセージを出力してから、データを共有します。
キュー
プロセス間でデータを渡すときは、その時点でQueueオブジェクトを使用できます。
例
import multiprocessing def evenno(numbers, q): for n in numbers: if n % 2 == 0: q.put(n) if __name__ == "__main__": q = multiprocessing.Queue() p = multiprocessing.Process(target=evenno, args=(range(10), q)) p.start() p.join() while q: print(q.get())
出力
0 2 4 6 8
この例では、最初に、数値が偶数かどうかをチェックする関数を作成します。数が偶数の場合は、キューの最後に挿入します。次に、キューオブジェクトとプロセスオブジェクトを作成してから、プロセスを開始します。
最後に、キューが空かどうかを確認します。
数値を出力するときは、最初にキューの前にある値を出力し、次に次の値を出力します。
ロック
そのような状況で一度に1つのプロセスだけを実行したい場合は、ロックが使用されます。つまり、時間は他のプロセスが同様のコードを実行するのをブロックします。プロセスが完了すると、ロックが解除されます。
Locksメソッドを使用した例
例
from multiprocessing import Process, Lock def dispmay_name(l, i): l.acquire() print ('Hi', i) l.release() if __name__ == '__main__': my_lock = Lock() my_name = ['Aadrika', 'Adwaita', 'Sakya', 'Sanj'] for name in my_name: Process(target=dispmay_name, args=(my_lock,name)).start()の名前
出力
Hi Aadrika Hi Adwaita Hi Sakya Hi Sanj
ロギング
マルチプロセッシングモジュールは、ロギングパッケージがロック機能を使用しない場合に、プロセス間のメッセージが実行中に混同されることを保証するロギングモジュールも提供します。
例
import multiprocessing, logging logger = multiprocessing.log_to_stderr() logger.setLevel(logging.INFO) logger.warning('Error has occurred')
この例では、最初にロギングおよびマルチプロセッシングモジュールをインポートし、次にmultiprocessing.log_to_stderr()メソッドを使用します。そして、get_logger()を呼び出し、sys.stderrに追加し、最後にロガーのレベルを設定してメッセージを伝達します。
-
Pythonのissuperset()
この記事では、Pythonでのissuperset()と、さまざまな分野でのその実装について学習します。 このメソッドは、セットBのすべての要素に引数として渡されるすべての要素セットAが含まれている場合はブール値Trueを返し、Aのすべての要素がBに存在しない場合はfalseを返します。 これは、BがAのスーパーセットである場合、それを意味します returns true; else False 例 いくつかの例を見てみましょう A = {'t','u','t','o','r','i',
-
Pythonソケットエラー48を修正
ソケットエラー48は、プロセスがすでに使用されているポートに自分自身をバインドしようとしたときにトリガーされるPythonエラーです。 「socket.error:[Errno48]アドレスはすでに使用されています」エラーの原因は何ですか? 簡単な調査の結果、原因は次のとおりであることがわかりました。 ポートにバインドされたプロセス: サーバー上にプロセスが作成されるたびに、インターネットとの通信にポートが使用されます。ポートは、一度に1人のゲストを楽しませることができるホストのようなものです。ただし、ポートを指定しない場合、サーバーはデフォルトのポートでポートを作成するだけです。次回