Python
 Computer >> コンピューター >  >> プログラミング >> Python

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種類の通信チャネルであるパイプとキューをサポートします。

パイプ

マルチプロセッシングでは、プロセス間で通信する場合、その状況ではパイプ 使用されます。

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


  1. Pythonのissuperset()

    この記事では、Pythonでのissuperset()と、さまざまな分野でのその実装について学習します。 このメソッドは、セットBのすべての要素に引数として渡されるすべての要素セットAが含まれている場合はブール値Trueを返し、Aのすべての要素がBに存在しない場合はfalseを返します。 これは、BがAのスーパーセットである場合、それを意味します returns true; else False 例 いくつかの例を見てみましょう A = {'t','u','t','o','r','i',

  2. Pythonソケットエラー48を修正

    ソケットエラー48は、プロセスがすでに使用されているポートに自分自身をバインドしようとしたときにトリガーされるPythonエラーです。 「socket.error:[Errno48]アドレスはすでに使用されています」エラーの原因は何ですか? 簡単な調査の結果、原因は次のとおりであることがわかりました。 ポートにバインドされたプロセス: サーバー上にプロセスが作成されるたびに、インターネットとの通信にポートが使用されます。ポートは、一度に1人のゲストを楽しませることができるホストのようなものです。ただし、ポートを指定しない場合、サーバーはデフォルトのポートでポートを作成するだけです。次回