집 >
백엔드 개발 >
파이썬 튜토리얼 >
다중 처리를 사용하여 Python에서 프로세스 간 통신을 구현하는 방법은 무엇입니까?
다중 처리를 사용하여 Python에서 프로세스 간 통신을 구현하는 방법은 무엇입니까?
王林
풀어 주다: 2023-05-08 21:31:06
앞으로
2192명이 탐색했습니다.
1. 프로세스 간 통신을 마스터해야 하는 이유
Python의 멀티 스레드 코드 효율성은 GIL에 의해 제한되며 멀티 코어 CPU로 가속화할 수 없습니다. 그러나 멀티 프로세스 방법은 GIL을 우회하고 이점을 활용할 수 있습니다. 다중 CPU 가속으로 인해 프로그램 성능이 크게 향상되지만
프로세스 간 통신은 고려해야 할 문제입니다. 프로세스는 스레드와 다릅니다. 프로세스는 자체 독립 메모리 공간을 가지며 전역 변수를 사용하여 프로세스 간에 데이터를 전송할 수 없습니다.
실제 프로젝트 요구 사항에는 집약적인 컴퓨팅이나 실시간 작업이 있는 경우가 많습니다. 때로는 사진, 대형 개체 등과 같은 대량의 데이터를 프로세스 간에 전송해야 하는 경우도 있습니다. 파일 직렬화 또는 네트워크 인터페이스를 통해 실시간 요구 사항을 충족하기 어렵습니다. redis 또는 kaffka, RabbitMQ의 타사 메시지 대기열 패키지는 시스템을 다시 복잡하게 만듭니다.
Python 다중 처리 모듈 자체는 메시지 메커니즘, 동기화 메커니즘, 공유 메모리
등 매우 효율적인 프로세스 간 통신 방법을 다양하게 제공합니다. Python 프로세스 간 통신의 다양한 방법과 보안 메커니즘의 사용을 이해하고 익히면 프로그램 실행 성능을 크게 향상시키는 데 도움이 될 수 있습니다.
2. 프로세스 간 다양한 통신 방법 소개
프로세스 간 통신의 주요 방법을 요약하면
프로세스 간 통신의 메모리 안전성에 대해
메모리 안전성이란 여러 프로세스가 서로 경쟁할 수 있음을 의미합니다. 같은 이유로 공유 변수 예외는 우발적인 파괴 및 기타 이유로 발생합니다. Multiprocessing 모듈에서 제공하는 큐, 파이프, 잠금 및 이벤트 개체는 모두 프로세스 간 통신 보안 메커니즘을 구현했습니다. 공유 메모리를 사용하여 통신하는 경우 이러한 공유 메모리 변수를 코드에서 직접 추적하고 파기해야 합니다. 그렇지 않으면 정상적으로 파기되거나 스크램블되지 않을 수 있습니다. 시스템 이상을 유발합니다. 개발자가 공유 메모리의 사용 특성을 명확히 알지 않는 한, 이 공유 메모리를 직접 사용하는 것이 아니라 Manager 관리자를 통해 공유 메모리를 사용하는 것을 권장합니다.
Memory Manager Manager
Multiprocessing은 프로세스 통신의 메모리 보안 문제를 균일하게 해결할 수 있는 메모리 관리자 Manager 클래스를 제공합니다. 목록, dict, Queue, Lock, Event, Shared를 포함한 다양한 공유 데이터를 관리자에 추가할 수 있습니다. 기억 등은 일률적으로 추적되어 파괴됩니다. 3. 메시지 메커니즘 통신
1) 파이프 통신 방법
은 1의 단순 소켓 채널과 유사하며 양쪽 끝에서 메시지를 보내고 받을 수 있습니다.
파이프 객체 생성 방법:
parent_conn, child_conn = Pipe(duplex=True/False)
로그인 후 복사
매개변수 설명
duplex=True, 파이프라인은 양방향 통신입니다
duplex=False, 파이프라인은 단방향 통신입니다. child_conn만 메시지를 보낼 수 있고 parent_conn은 메시지를 보낼 수 있습니다. 받기만 합니다.
샘플 코드:
from multiprocessing import Process, Pipe
def myfunction(conn):
conn.send(['hi!! I am Python'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=myfunction, args=(child_conn,))
p.start()
print (parent_conn.recv() )
p.join()
로그인 후 복사
2) 메시지 큐 큐 통신 방법
Multiprocessing의 Queue 클래스는 Python queue 3.0 버전에서 수정되어 생산자와 메시지 전달자 간의 데이터 전송을 쉽게 구현할 수 있으며 Multiprocessing Queue 모듈은 잠금 보안 메커니즘.
import multiprocessing
def producer(numbers, q):
for x in numbers:
if x % 2 == 0:
if q.full():
print("queue is full")
break
q.put(x)
print(f"put {x} in queue by producer")
return None
def consumer(q):
while not q.empty():
print(f"take data {q.get()} from queue by consumer")
return None
if __name__ == "__main__":
# 设置1个queue对象,最大长度为5
qu = multiprocessing.Queue(maxsize=5,)
# 创建producer子进程,把queue做为其中1个参数传给它,该进程负责写
p5 = multiprocessing.Process(
name="producer-1",
target=producer,
args=([random.randint(1, 100) for i in range(0, 10)], qu)
)
p5.start()
p5.join()
#创建consumer子进程,把queue做为1个参数传给它,该进程中队列中读
p6 = multiprocessing.Process(
name="consumer-1",
target=consumer,
args=(qu,)
)
p6.start()
p6.join()
print(qu.qsize())
>>> from multiprocessing import shared_memory
>>> shm_a = shared_memory.SharedMemory(create=True, size=10)
>>> type(shm_a.buf)
<class 'memoryview'>
>>> buffer = shm_a.buf
>>> len(buffer)
10
>>> buffer[:4] = bytearray([22, 33, 44, 55]) # Modify multiple at once
>>> buffer[4] = 100 # Modify single byte at a time
>>> # Attach to an existing shared memory block
>>> shm_b = shared_memory.SharedMemory(shm_a.name)
>>> import array
>>> array.array('b', shm_b.buf[:5]) # Copy the data into a new array.array
array('b', [22, 33, 44, 55, 100])
>>> shm_b.buf[:5] = b'howdy' # Modify via shm_b using bytes
>>> bytes(shm_a.buf[:5]) # Access via shm_a
b'howdy'
>>> shm_b.close() # Close each SharedMemory instance
>>> shm_a.close()
>>> shm_a.unlink() # Call unlink only once to release the shared memory
>>> with SharedMemoryManager() as smm:
... sl = smm.ShareableList(range(2000))
... # Divide the work among two processes, storing partial results in sl
... p1 = Process(target=do_work, args=(sl, 0, 1000))
... p2 = Process(target=do_work, args=(sl, 1000, 2000))
... p1.start()
... p2.start() # A multiprocessing.Pool might be more efficient
... p1.join()
... p2.join() # Wait for all work to complete in both processes
... total_result = sum(sl) # Consolidate the partial results now in sl
from multiprocessing.managers import BaseManager
class MathsClass:
def add(self, x, y):
return x + y
def mul(self, x, y):
return x * y
class MyManager(BaseManager):
pass
MyManager.register('Maths', MathsClass)
if __name__ == '__main__':
with MyManager() as manager:
maths = manager.Maths()
print(maths.add(4, 3)) # prints 7
print(maths.mul(7, 8))
로그인 후 복사
위 내용은 다중 처리를 사용하여 Python에서 프로세스 간 통신을 구현하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!