프로세스 상호 통신

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

다양한 통신 메커니즘

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

대기열

큐는 다중 프로세스 프로그램과 함께 사용할 수 있습니다. 큐 클래스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()

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

산출

P2 exiting
P1 exiting
Terminating