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

Pythonでのマルチプロセッシング

多处理プログラムパッケージは、新しいサブプロセスをロードおよび実行する関数をサポートしています。子プロセスを終了または実行を続けるために、現在のプロセスは、スレッドモジュールの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」というメッセージを表示するプロセスを作成し、データを共有します。

s列

当我们在进程間でデータを渡すとき、その場合、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 を使用します。これは、他のプロセスが同様のコードを実行するのを時間が阻止するという意味です。このプロセスが完了すると、ロックを解放します。

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に追加し、最後にレコーダーのレベルを設定してメッセージを渡します。