프로세스 상호 통신
프로세스 상호 통신은 프로세스 간의 데이터 교환을 의미합니다. 병렬 애플리케이션 개발을 위해서는 프로세스 간 데이터 교환이 필요합니다. 다음 다이어그램은 여러 하위 프로세스 간의 동기화를위한 다양한 통신 메커니즘을 보여줍니다.
다양한 통신 메커니즘
이 섹션에서는 다양한 통신 메커니즘에 대해 알아 봅니다. 메커니즘은 아래에 설명되어 있습니다.
대기열
큐는 다중 프로세스 프로그램과 함께 사용할 수 있습니다. 큐 클래스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