English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
多处理プログラムパッケージは、新しいサブプロセスをロードおよび実行する関数をサポートしています。子プロセスを終了または実行を続けるために、現在のプロセスは、スレッドモジュールのAPIに似たAPIを使用して待機する必要があります。
Multiprocessingを使用する場合、まずプロセスを作成する必要があります。プロセスオブジェクト。それから、それが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()
この例では、数字の立方を計算し、すべての結果をコンソールに印刷するプロセスを作成します。
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つの数字の立方を計算し、その一方で、次のプロセス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つの通信チャネルです。
多処理では、プロセス間で通信を行うとき、この場合、パイプを使用します。パイプ。
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つのメソッドがありますsend()
、一つの方法は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__": 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('エラーが発生しました')
このサンプルでは、まずログ記録およびマルチプロセッシングモジュールをインポートし、multiprocessing.log_to_stderr()メソッドを使用して。その後、get_logger()を呼び出し、sys.stderrに追加し、最後にレコーダーのレベルを設定してメッセージを渡します。