파이썬 병렬 스레드 및 프로세스 간의 차이점
현재 이해에 따르면 프로세스는 실행 중에 사용되는 모든 리소스와 함께 명령어 모음입니다. 여기에는 코드, 입력/출력, 리소스, 메모리, 파일 핸들 등이 포함됩니다. 즉, 프로그램 실행에 필요한 모든 것을 포함한다.
# this script, while running as a whole, is considered a process
print('hello world')
with open('something.txt', 'a') as file_handle:
for i in range(500):
file_handle.write('blablabla')
print('job done!')
컴퓨터의 처리 능력을 더 효율적으로 활용하기 위해 추가 프로세스나 스레드를 생성할 수 있습니다. 어떤 것을 선택해야 할까요? 단순한 파이썬 스크립트 프로세스 유추와 어떻게 비교합니까? 다른 프로세스를 생성하는 것은 다른 파일 이름으로 전체 스크립트를 호출하는 것과 유사합니까?
# changed filename (is this "another process?")
print('hello world')
with open('something_else.txt', 'a') as file_handle:
for i in range(500):
file_handle.write('blablabla')
print('job done!')
나는 또한 단일 프로세스가 여러 스레드를 포함할 수 있다는 막연한 생각을 가지고 있는데, 그렇다면 루프를 위해 더 많은 "개념적"을 로드하는 것과 동등할까?
# like would this be a "thread" a barebones "subset" of an entire program?
with open('something.txt', 'a') as file_handle:
for i in range(500):
file_handle.write('blablabla')
프로세스와 스레드의 주요 차이점은 무엇입니까? 온라인 소스는 프로세스가 더 자율적이고 자원 집약적인 반면 스레드는 더 가볍고 서로 메모리를 공유할 수 있다고 제안한다. 하지만 이것은 실제로 무엇을 의미할까요? 프로세스도 메모리를 공유할 수 없는 이유는 무엇입니까? 스레드가 메모리를 공유할 수 있는 경우 동일한 스크립트에서 생성된 다른 스레드의 변수(예: thread_a import var_data)에 액세스할 수 없는 이유는 무엇입니까?
마지막으로, 무엇이 정확히 무엇을 계산하는가? CPU는 스레드나 프로세스를 계산합니까, 아니면 여러 코어 등을 포함하는 더 넓은 용어입니까? 코어는 프로세스나 스레드를 계산합니까?
요약:.
프로세스의 예로 단순한 파이썬 스크립트를 사용하면 다른 프로세스/스레드를 생성하는 것과 동등한 것이 무엇입니까? (예: 스크립트의 중복 부분/코드의 일부 섹션만 해당)
프로세스는 스레드와 근본적으로 어떻게 다르며, 프로세스가 스레드가 할 수 없는 것을 할 수 있는 예는 무엇입니까?
메모리/데이터가 스레드보다 프로세스에서 "공유하기 어려운" 것으로 설명되는 이유는 무엇입니까? 스레드는 어떻게 데이터를 공유합니까?
CPU는 스레드 또는 프로세스를 계산합니까. 코어가 스레드 또는 프로세스를 계산합니까?
특정한 것들을 언제 사용해야 하는지에 대한 일반적인 지침과 예시를 제공할 수 있나요? 파이썬에서 스레드 대 프로세스에 대한 경험칙이 있습니까?
기본적으로 Python은 코드의 어떤 부분도 메모리에 접근할 수 있도록 설계되어 있다. 동일한 메모리에 동시에 여러 번 호출하는 등의 문제를 방지하기 위해 두 작업을 동시에 실행할 수 없도록 하는 잠금 기능이 있습니다. 그래서 이것이 파이썬이 순수하게 절차적이고, 차례로 작업을 실행하는 이유이다.
현대 프로그래밍에서는 멀티 코어 프로세서를 더 잘 사용하여 성능을 향상시키기 위해 프로그래밍을 병렬화하려는 의지가 있다. GIL 때문에 두 가지 해결 방법이 있습니다:
는 여러 태스크를 서로 다른 스레드에서 동시에 생성할 수 있는 모듈입니다. 문제는 그것이 실제로 동시에 있는 것이 아니라 원자적인 작업으로 잘라지고, 다른 작업들 사이에서 전환될 것이라는 것이다. 하지만 두 가지 작업을 동시에 수행할 수 없으므로 평소처럼 기억을 공유할 수 있습니다. 그래서 간단합니다.
반면에 실제 프로세스를 생성할 수 있으며, 이 프로세스는 동시에 작동합니다. 그러나 가격은 이러한 프로세스 간에 공유 메모리를 안전하게 보유할 수 없다는 것입니다(기존 방식으로는). 여러 개의 스레드가 포함된 여러 프로세스를 갖는 데 문제가 없습니다. 하지만 너는 완전히 혼자가 아니다. 예를 들어 프로세스 간에 안전하게 통신하는 몇 가지 방법이 있습니다. 더 자세히 보실 수 있습니다.
요약하자면, 스레드 및 프로세스를 사용하면 다른 작업을 위해 일부 작업을 분리할 수 있으므로 기본 절차 프로그램을 개선할 수 있습니다. 일부 언어에서는 작동 방식에 큰 차이가 없지만 파이썬에서 기억해야 할 주요 사항은 다음과 같다:
스레드: 공유 메모리를 유지하지만 실제로 병렬 프로그래밍은 하지 않습니다. 이것은 코드가 대기 시간으로 사용되는 경우 유용하므로, 중간에 다른 작업을 수행할 수 있습니다. 100% CPU를 사용하는 경우 작업 간에 실행이 자주 변경되고 오버헤드가 발생하므로 코드 속도가 느려집니다.
프로세스: 파이썬에서는 일반적으로 사용하지 않는 메모리에 대해 걱정해야 하기 때문에 구현하기가 조금 더 어렵습니다. 주요 장점은 코드가 병렬화될 수 있다면 성능을 획기적으로 향상시킬 수 있다는 것입니다.
'개발하자' 카테고리의 다른 글
Svelte에서 소품을 선택 사항으로 선언할 수 있는 방법이 있나요 (0) | 2023.01.24 |
---|---|
빠른 API 비동기 백그라운드 작업이 다른 요청을 차단합니까? (0) | 2023.01.24 |
비주얼 스튜디오 코드 내에서 주피터 노트북의 모든 출력을 표시하는 방법은 무엇입니까? (0) | 2023.01.22 |
Jenkins Declarative: 여러 에이전트가 있는 Kubernetes 플러그인 (0) | 2023.01.22 |
YAML을 JSON으로 변환하는 중 오류가 발생했습니다. 필요한 키 쿠버네를 찾지 못했습니다 (0) | 2023.01.21 |