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 중국어 웹사이트의 기타 관련 기사를 참조하세요!
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
Python과 JavaScript는 커뮤니티, 라이브러리 및 리소스 측면에서 고유 한 장점과 단점이 있습니다. 1) Python 커뮤니티는 친절하고 초보자에게 적합하지만 프론트 엔드 개발 리소스는 JavaScript만큼 풍부하지 않습니다. 2) Python은 데이터 과학 및 기계 학습 라이브러리에서 강력하며 JavaScript는 프론트 엔드 개발 라이브러리 및 프레임 워크에서 더 좋습니다. 3) 둘 다 풍부한 학습 리소스를 가지고 있지만 Python은 공식 문서로 시작하는 데 적합하지만 JavaScript는 MDNWebDocs에서 더 좋습니다. 선택은 프로젝트 요구와 개인적인 이익을 기반으로해야합니다.
Docker는 Linux 커널 기능을 사용하여 효율적이고 고립 된 응용 프로그램 실행 환경을 제공합니다. 작동 원리는 다음과 같습니다. 1. 거울은 읽기 전용 템플릿으로 사용되며, 여기에는 응용 프로그램을 실행하는 데 필요한 모든 것을 포함합니다. 2. Union 파일 시스템 (Unionfs)은 여러 파일 시스템을 스택하고 차이점 만 저장하고 공간을 절약하고 속도를 높입니다. 3. 데몬은 거울과 컨테이너를 관리하고 클라이언트는 상호 작용을 위해 사용합니다. 4. 네임 스페이스 및 CGroup은 컨테이너 격리 및 자원 제한을 구현합니다. 5. 다중 네트워크 모드는 컨테이너 상호 연결을 지원합니다. 이러한 핵심 개념을 이해 함으로써만 Docker를 더 잘 활용할 수 있습니다.
vs 코드에서는 다음 단계를 통해 터미널에서 프로그램을 실행할 수 있습니다. 코드를 준비하고 통합 터미널을 열어 코드 디렉토리가 터미널 작업 디렉토리와 일치하는지 확인하십시오. 프로그래밍 언어 (예 : Python의 Python Your_file_name.py)에 따라 실행 명령을 선택하여 성공적으로 실행되는지 여부를 확인하고 오류를 해결하십시오. 디버거를 사용하여 디버깅 효율을 향상시킵니다.
VS 코드는 파이썬을 작성하는 데 사용될 수 있으며 파이썬 애플리케이션을 개발하기에 이상적인 도구가되는 많은 기능을 제공합니다. 사용자는 다음을 수행 할 수 있습니다. Python 확장 기능을 설치하여 코드 완료, 구문 강조 및 디버깅과 같은 기능을 얻습니다. 디버거를 사용하여 코드를 단계별로 추적하고 오류를 찾아 수정하십시오. 버전 제어를 위해 git을 통합합니다. 코드 서식 도구를 사용하여 코드 일관성을 유지하십시오. 라인 도구를 사용하여 잠재적 인 문제를 미리 발견하십시오.
파이썬은 자동화, 스크립팅 및 작업 관리가 탁월합니다. 1) 자동화 : 파일 백업은 OS 및 Shutil과 같은 표준 라이브러리를 통해 실현됩니다. 2) 스크립트 쓰기 : PSUTIL 라이브러리를 사용하여 시스템 리소스를 모니터링합니다. 3) 작업 관리 : 일정 라이브러리를 사용하여 작업을 예약하십시오. Python의 사용 편의성과 풍부한 라이브러리 지원으로 인해 이러한 영역에서 선호하는 도구가됩니다.
VS 코드는 Windows 8에서 실행될 수 있지만 경험은 크지 않을 수 있습니다. 먼저 시스템이 최신 패치로 업데이트되었는지 확인한 다음 시스템 아키텍처와 일치하는 VS 코드 설치 패키지를 다운로드하여 프롬프트대로 설치하십시오. 설치 후 일부 확장은 Windows 8과 호환되지 않을 수 있으며 대체 확장을 찾거나 가상 시스템에서 새로운 Windows 시스템을 사용해야합니다. 필요한 연장을 설치하여 제대로 작동하는지 확인하십시오. Windows 8에서는 VS 코드가 가능하지만 더 나은 개발 경험과 보안을 위해 새로운 Windows 시스템으로 업그레이드하는 것이 좋습니다.
VS 코드 확장은 악의적 인 코드 숨기기, 취약성 악용 및 합법적 인 확장으로 자위하는 등 악성 위험을 초래합니다. 악의적 인 확장을 식별하는 방법에는 게시자 확인, 주석 읽기, 코드 확인 및주의해서 설치가 포함됩니다. 보안 조치에는 보안 인식, 좋은 습관, 정기적 인 업데이트 및 바이러스 백신 소프트웨어도 포함됩니다.