프로세스 상호 통신

프로세스 상호 통신은 프로세스 간의 데이터 교환을 의미합니다. 병렬 애플리케이션 개발을 위해서는 프로세스 간 데이터 교환이 필요합니다. 다음 다이어그램은 여러 하위 프로세스 간의 동기화를위한 다양한 통신 메커니즘을 보여줍니다.

다양한 통신 메커니즘

이 섹션에서는 다양한 통신 메커니즘에 대해 알아 봅니다. 메커니즘은 아래에 설명되어 있습니다.

대기열

큐는 다중 프로세스 프로그램과 함께 사용할 수 있습니다. 큐 클래스multiprocessing 모듈은 Queue.Queue수업. 따라서 동일한 API를 사용할 수 있습니다.Multiprocessing.Queue는 프로세스 간의 통신을위한 스레드 및 프로세스 안전 FIFO (선입 선출) 메커니즘을 제공합니다.

예

다음은 다중 처리의 Queue 클래스 개념을 이해하기 위해 다중 처리에 대한 Python 공식 문서에서 가져온 간단한 예제입니다.

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(), 프로세스간에 통신합니다.

예

다음은 다중 처리에 대한 파이썬 공식 문서에서 가져온 간단한 예제입니다. 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- 배열 및 값

Multiprocessing 모듈은 공유 메모리 맵에 데이터를 저장하기위한 Array 및 Value 객체를 제공합니다. Array 공유 메모리에서 할당 된 ctypes 배열이며 Value 공유 메모리에서 할당 된 ctypes 객체입니다.

함께하려면 다중 처리에서 Process, Value, Array를 가져옵니다.

예

다음 Python 스크립트는 프로세스간에 일부 데이터를 공유하기 위해 Ctypes Array 및 Value를 활용하기 위해 Python 문서에서 가져온 예제입니다.

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 스크립트는 두 프로세스를 서로 병렬로 실행하는 간단한 예입니다. 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()

위의 스크립트에서 두 가지 기능 즉 P1 과 P2 만들어지고 장식되었습니다 @process 프로세스로 변환합니다.

산출

P2 exiting
P1 exiting
Terminating