Prozesse Interkommunikation

Prozesskommunikation bedeutet den Datenaustausch zwischen Prozessen. Es ist notwendig, die Daten zwischen Prozessen auszutauschen, um eine parallele Anwendung zu entwickeln. Das folgende Diagramm zeigt die verschiedenen Kommunikationsmechanismen für die Synchronisation zwischen mehreren Unterprozessen -

Verschiedene Kommunikationsmechanismen

In diesem Abschnitt lernen wir die verschiedenen Kommunikationsmechanismen kennen. Die Mechanismen werden unten beschrieben -

Warteschlangen

Warteschlangen können mit Multiprozessprogrammen verwendet werden. Die Warteschlangenklasse vonmultiprocessing Modul ähnelt dem Queue.QueueKlasse. Daher kann dieselbe API verwendet werden.Multiprocessing.Queue bietet uns einen thread- und prozesssicheren FIFO-Kommunikationsmechanismus (First-In-First-Out) zwischen Prozessen.

Beispiel

Im Folgenden finden Sie ein einfaches Beispiel aus den offiziellen Python-Dokumenten zur Mehrfachverarbeitung, um das Konzept der Multiprozessor-Klasse Queue zu verstehen.

from multiprocessing import Process, Queue
import queue
import random
def f(q):
   q.put([42, None, 'hello'])
def main():
   q = Queue()
   p = Process(target = f, args = (q,))
   p.start()
   print (q.get())
if __name__ == '__main__':
   main()

Ausgabe

[42, None, 'hello']

Rohre

Es ist eine Datenstruktur, die zur Kommunikation zwischen Prozessen in Mehrprozessprogrammen verwendet wird. Die Funktion Pipe () gibt ein Paar von Verbindungsobjekten zurück, die durch eine Pipe verbunden sind, die standardmäßig Duplex (bidirektional) ist. Es funktioniert folgendermaßen:

  • Es gibt ein Paar Verbindungsobjekte zurück, die die beiden Rohrenden darstellen.

  • Jedes Objekt hat zwei Methoden - send() und recv(), um zwischen Prozessen zu kommunizieren.

Beispiel

Im Folgenden finden Sie ein einfaches Beispiel aus den offiziellen Python-Dokumenten zur Mehrfachverarbeitung, um das Konzept von zu verstehen Pipe() Funktion der Mehrfachverarbeitung.

from multiprocessing import Process, Pipe

def f(conn):
   conn.send([42, None, 'hello'])
   conn.close()

if __name__ == '__main__':
   parent_conn, child_conn = Pipe()
   p = Process(target = f, args = (child_conn,))
   p.start()
   print (parent_conn.recv())
   p.join()

Ausgabe

[42, None, 'hello']

Manager

Manager ist eine Klasse von Multiprozessor-Modulen, mit denen gemeinsame Informationen zwischen allen Benutzern koordiniert werden können. Ein Managerobjekt steuert einen Serverprozess, der gemeinsam genutzte Objekte verwaltet und es anderen Prozessen ermöglicht, diese zu bearbeiten. Mit anderen Worten, Manager bieten eine Möglichkeit, Daten zu erstellen, die von verschiedenen Prozessen gemeinsam genutzt werden können. Im Folgenden sind die verschiedenen Eigenschaften des Managerobjekts aufgeführt:

  • Die Haupteigenschaft von Manager ist die Steuerung eines Serverprozesses, der die freigegebenen Objekte verwaltet.

  • Eine weitere wichtige Eigenschaft besteht darin, alle freigegebenen Objekte zu aktualisieren, wenn ein Prozess sie ändert.

Beispiel

Im Folgenden finden Sie ein Beispiel, in dem das Managerobjekt zum Erstellen eines Listendatensatzes im Serverprozess und zum Hinzufügen eines neuen Datensatzes zu dieser Liste verwendet wird.

import multiprocessing

def print_records(records):
   for record in records:
      print("Name: {0}\nScore: {1}\n".format(record[0], record[1]))

def insert_record(record, records):
   records.append(record)
      print("A New record is added\n")

if __name__ == '__main__':
   with multiprocessing.Manager() as manager:

      records = manager.list([('Computers', 1), ('Histoty', 5), ('Hindi',9)])
      new_record = ('English', 3)

      p1 = multiprocessing.Process(target = insert_record, args = (new_record, records))
      p2 = multiprocessing.Process(target = print_records, args = (records,))
	  p1.start()
      p1.join()
      p2.start()
      p2.join()

Ausgabe

A New record is added

Name: Computers
Score: 1

Name: Histoty
Score: 5

Name: Hindi
Score: 9

Name: English
Score: 3

Konzept der Namespaces im Manager

Manager Class wird mit dem Konzept von Namespaces geliefert, einer schnellen Methode zum Teilen mehrerer Attribute über mehrere Prozesse hinweg. Namespaces verfügen über keine öffentliche Methode, die aufgerufen werden kann, sie verfügen jedoch über beschreibbare Attribute.

Beispiel

Das folgende Python-Skriptbeispiel hilft uns, Namespaces für die gemeinsame Nutzung von Daten zwischen Hauptprozess und untergeordnetem Prozess zu verwenden.

import multiprocessing

def Mng_NaSp(using_ns):

   using_ns.x +=5
   using_ns.y *= 10

if __name__ == '__main__':
   manager = multiprocessing.Manager()
   using_ns = manager.Namespace()
   using_ns.x = 1
   using_ns.y = 1

   print ('before', using_ns)
   p = multiprocessing.Process(target = Mng_NaSp, args = (using_ns,))
   p.start()
   p.join()
   print ('after', using_ns)

Ausgabe

before Namespace(x = 1, y = 1)
after Namespace(x = 6, y = 10)

Ctypes-Array und Wert

Das Multiprocessing-Modul bietet Array- und Value-Objekte zum Speichern der Daten in einer gemeinsam genutzten Speicherzuordnung. Array ist ein ctypes-Array, das aus dem gemeinsam genutzten Speicher und zugewiesen wird Value ist ein ctypes-Objekt, das aus dem gemeinsam genutzten Speicher zugewiesen wird.

Importieren Sie dazu Process, Value, Array aus Multiprocessing.

Beispiel

Das folgende Python-Skript ist ein Beispiel aus Python-Dokumenten, in dem Ctypes Array und Value zum Teilen einiger Daten zwischen Prozessen verwendet werden.

def f(n, a):
   n.value = 3.1415927
   for i in range(len(a)):
   a[i] = -a[i]

if __name__ == '__main__':
   num = Value('d', 0.0)
   arr = Array('i', range(10))

   p = Process(target = f, args = (num, arr))
   p.start()
   p.join()
   print (num.value)
   print (arr[:])

Ausgabe

3.1415927
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]

Sequentielle Prozesse kommunizieren (CSP)

CSP wird verwendet, um die Interaktion von Systemen mit anderen Systemen mit gleichzeitigen Modellen zu veranschaulichen. CSP ist ein Framework zum gleichzeitigen Schreiben von Programmen oder Programmen über die Nachrichtenübermittlung und daher zur Beschreibung der Parallelität wirksam.

Python-Bibliothek - PyCSP

Für die Implementierung von Kernprimitiven in CSP verfügt Python über eine Bibliothek namens PyCSP. Es hält die Implementierung sehr kurz und lesbar, so dass es sehr leicht zu verstehen ist. Es folgt das grundlegende Prozessnetzwerk von PyCSP -

Im obigen PyCSP-Prozessnetzwerk gibt es zwei Prozesse - Prozess1 und Prozess 2. Diese Prozesse kommunizieren, indem sie Nachrichten über zwei Kanäle weiterleiten - Kanal 1 und Kanal 2.

PyCSP installieren

Mit Hilfe des folgenden Befehls können wir die Python-Bibliothek PyCSP installieren -

pip install PyCSP

Beispiel

Das folgende Python-Skript ist ein einfaches Beispiel für die parallele Ausführung von zwei Prozessen. Dies geschieht mit Hilfe der PyCSP Python Libabary -

from pycsp.parallel import *
import time
@process
def P1():
   time.sleep(1)
   print('P1 exiting')
@process
def P2():
   time.sleep(1)
   print('P2 exiting')
def main():
   Parallel(P1(), P2())
   print('Terminating')
if __name__ == '__main__':
   main()

Im obigen Skript gibt es nämlich zwei Funktionen P1 und P2 wurden erstellt und dann mit dekoriert @process um sie in Prozesse umzuwandeln.

Ausgabe

P2 exiting
P1 exiting
Terminating