Взаимодействие процессов
Взаимосвязь процессов означает обмен данными между процессами. Для разработки параллельного приложения необходим обмен данными между процессами. На следующей диаграмме показаны различные механизмы связи для синхронизации между несколькими подпроцессами.
Различные механизмы коммуникации
В этом разделе мы узнаем о различных механизмах связи. Механизмы описаны ниже -
Очереди
Очереди можно использовать в многопроцессорных программах. Класс Queuemultiprocessing модуль похож на Queue.Queueкласс. Следовательно, можно использовать тот же API.Multiprocessing.Queue предоставляет нам безопасный для потоков и процессов FIFO (first-in first-out) механизм связи между процессами.
пример
Ниже приводится простой пример, взятый из официальных документов 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(), чтобы общаться между процессами.
пример
Ниже приведен простой пример, взятый из официальных документов 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
Класс 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 представляет собой массив ctypes, выделенный из общей памяти и Value это объект ctypes, выделенный из общей памяти.
Чтобы быть с, импортируйте Process, Value, Array из multiprocessing.
пример
Следующий сценарий Python - это пример, взятый из документации Python, для использования массива Ctypes и значения для обмена некоторыми данными между процессами.
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 есть два процесса - Process1 и Process 2. Эти процессы взаимодействуют, передавая сообщения через два канала - канал 1 и канал 2.
Установка PyCSP
С помощью следующей команды мы можем установить библиотеку Python PyCSP -
pip install PyCSP
пример
Следующий сценарий Python представляет собой простой пример запуска двух процессов параллельно друг другу. Это делается с помощью библиотеки Python PyCSP -
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 для преобразования их в процессы.
Выход
P2 exiting
P1 exiting
Terminating