Учебники

Взаимодействие процессов

Взаимосвязь процессов означает обмен данными между процессами. Для обмена параллельными приложениями необходимо обмениваться данными между процессами. Следующая диаграмма показывает различные механизмы связи для синхронизации между несколькими подпроцессами —

сношение

Различные коммуникационные механизмы

В этом разделе мы узнаем о различных коммуникационных механизмах. Механизмы описаны ниже —

Очереди

Очереди можно использовать с многопроцессорными программами. Класс Queue многопроцессорного модуля аналогичен классу Queue.Queue . Следовательно, можно использовать один и тот же API. Мультипроцессорная обработка .Queue предоставляет нам механизм взаимодействия потоков между процессами FIFO (первым пришел — первым обслужен).

пример

Ниже приведен простой пример, взятый из официальных документов Python по многопроцессорности, для понимания концепции многопроцессорного класса Queue.

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()

Выход

[42, None, 'hello']

трубы

Это структура данных, которая используется для связи между процессами в многопроцессорных программах. Функция Pipe () возвращает пару объектов соединения, соединенных каналом, который по умолчанию является дуплексным (двухсторонним). Это работает следующим образом —

  • Он возвращает пару объектов соединения, которые представляют два конца канала.

  • У каждого объекта есть два метода — send () и recv () для взаимодействия между процессами.

Он возвращает пару объектов соединения, которые представляют два конца канала.

У каждого объекта есть два метода — send () и recv () для взаимодействия между процессами.

пример

Ниже приведен простой пример, взятый из официальных документов Python по многопроцессорности, для понимания концепции функции многопроцессорной обработки Pipe () .

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()

Выход

[42, None, 'hello']

Менеджер

Менеджер — это класс многопроцессорных модулей, который обеспечивает способ координации общей информации между всеми его пользователями. Управляющий объект управляет процессом сервера, который управляет общими объектами и позволяет другим процессам манипулировать ими. Другими словами, менеджеры предоставляют способ создавать данные, которые могут быть разделены между различными процессами. Ниже приведены различные свойства объекта менеджера —

  • Основным свойством менеджера является управление серверным процессом, который управляет общими объектами.

  • Другим важным свойством является обновление всех общих объектов, когда какой-либо процесс изменяет их.

Основным свойством менеджера является управление серверным процессом, который управляет общими объектами.

Другим важным свойством является обновление всех общих объектов, когда какой-либо процесс изменяет их.

пример

Ниже приведен пример, который использует объект менеджера для создания записи списка в процессе сервера, а затем добавления новой записи в этот список.

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()

Выход

A New record is added

Name: Computers
Score: 1

Name: Histoty
Score: 5

Name: Hindi
Score: 9

Name: English
Score: 3

Концепция пространств имен в менеджере

Класс Manager поставляется с концепцией пространств имен, которая является быстрым способом разделения нескольких атрибутов между несколькими процессами. Пространства имен не содержат никаких открытых методов, которые можно вызывать, но у них есть доступные для записи атрибуты.

пример

Следующий пример скрипта Python помогает нам использовать пространства имен для обмена данными между основным процессом и дочерним процессом —

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)

Выход

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

Ctypes-Array и Value

Многопроцессорный модуль предоставляет объекты Array и Value для хранения данных в карте общей памяти. Массив — это массив ctypes, выделенный из общей памяти, а Value — объект ctypes, выделенный из общей памяти.

Чтобы быть с, импортируйте Process, Value, Array из мультипроцессора.

пример

Следующий скрипт Python — это пример, взятый из документации по Python для использования массива Ctypes и Value для обмена некоторыми данными между процессами.

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[:])

Выход

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

Связь последовательных процессов (CSP)

CSP используется для иллюстрации взаимодействия систем с другими системами с одновременными моделями. CSP является платформой для написания параллельных или программных программ посредством передачи сообщений и, следовательно, он эффективен для описания параллелизма.

Библиотека Python — PyCSP

Для реализации основных примитивов, найденных в CSP, в Python есть библиотека под названием PyCSP. Это делает реализацию очень короткой и удобочитаемой, чтобы ее можно было легко понять. Ниже приводится основная сеть процессов PyCSP —

PyCSP

В вышеупомянутой сети процессов PyCSP есть два процесса — Process1 и Process 2. Эти процессы взаимодействуют, передавая сообщения по двум каналам — каналу 1 и каналу 2.

Установка PyCSP

С помощью следующей команды мы можем установить библиотеку Python PyCSP —

pip install PyCSP

пример

Следующий скрипт Python — простой пример запуска двух процессов параллельно друг другу. Это делается с помощью библиотеки PyCSP python —

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()

В приведенном выше сценарии две функции, а именно P1 и P2 , были созданы, а затем украшены @process для преобразования их в процессы.