Python 의 프로 세 스 와 스 레 드 를 자세히 설명 합 니 다.

프로 세 스 가 뭐 예요?
프로 세 스 는 프로그램 이 데이터 세트 에서 동적 으로 실행 되 는 과정 이다.프로 세 스 는 일반적으로 프로그램,데이터 세트,프로 세 스 제어 블록 세 부분 으로 구성 된다.우리 가 작성 한 프로그램 은 프로 세 스 가 어떤 기능 을 완성 하고 어떻게 완성 해 야 하 는 지 설명 하 는 데 사 용 됩 니 다.데이터 세트 는 프로그램 이 실행 하 는 과정 에서 사용 해 야 할 자원 입 니 다.프로 세 스 제어 블록 은 프로 세 스 의 외부 특징 을 기록 하고 프로 세 스 의 실행 변화 과정 을 설명 합 니 다.시스템 은 이 를 이용 하여 프로 세 스 를 제어 하고 관리 할 수 있 습 니 다.이것 은 시스템 감지 프로 세 스 가 존재 하 는 유일한 표지 입 니 다.
스 레 드 가 뭐 예요?
스 레 드 는 경량급 프로 세 스 라 고도 합 니 다.기본 적 인 CPU 실행 장치 이자 프로그램 실행 과정 에서 가장 작은 단원 입 니 다.스 레 드 ID,프로그램 카운터,레지스터 집합 과 스 택 이 공동으로 구성 되 어 있 습 니 다.스 레 드 의 도입 은 프로그램 이 동시에 실 행 될 때의 비용 을 줄 이 고 운영 체제 의 병행 성능 을 향상 시 켰 다.스 레 드 는 자신의 시스템 자원 이 없습니다.
프로 세 스 와 스 레 드 의 차이
프로 세 스 는 컴퓨터 의 프로그램 이 특정한 데이터 집합 에서 의 운행 활동 으로 시스템 이 자원 배분 과 배 치 를 하 는 기본 단위 이 며 운영 체제 구조의 기초 이다.또는 프로 세 스 는 일정한 독립 기능 을 가 진 프로그램 으로 특정한 데이터 집합 에서 의 실행 활동 에 관 한 것 이 고 프로 세 스 는 시스템 이 자원 배분 과 배 치 를 하 는 독립 된 단위 이다.
스 레 드 는 프로 세 스 의 실체 로 CPU 스케줄 링 과 할당 의 기본 단위 이 며 프로 세 스 보다 작은 독립 적 으로 실행 할 수 있 는 기본 단위 입 니 다.
프로 세 스 와 스 레 드 의 관계:
(1)하나의 스 레 드 는 하나의 프로 세 스 에 만 속 할 수 있 고 하나의 프로 세 스 는 여러 개의 스 레 드 가 있 을 수 있 지만 적어도 하나의 스 레 드 가 있다.
(2)자원 은 프로 세 스에 분배 되 고 같은 프로 세 스 의 모든 라인 은 이 프로 세 스 의 모든 자원 을 공유 합 니 다.
(3)CPU 는 스 레 드,즉 실제 CPU 에서 실행 중인 것 은 스 레 드 입 니 다.

병행 과 병발
병렬 처리(Parallel Processing)는 컴퓨터 시스템 에서 두 개 이상 의 처 리 를 동시에 수행 할 수 있 는 계산 방법 이다.병행 처 리 는 같은 프로그램의 다른 측면 에서 동시에 일 할 수 있 고 병행 처리 의 주요 목적 은 대형 과 복잡 한 문제 의 해결 시간 을 절약 하 는 것 이다.
동시 처리(concurrency Processing)는 한 시간 대 에 몇 개의 프로그램 이 실행 이 끝 날 때 까지 실행 되 고 있 으 며,이 몇 개의 프로그램 은 모두 같은 프로세서(CPU)에서 실행 되 고 있 지만,임의의 시간 대 에 한 개의 프로그램 만 프로세서(CPU)에서 실행 되 고 있다 는 것 을 말한다.

동기 화 와 비동기
동기 화 란 한 프로 세 스 가 어떤 요청 을 수행 할 때 이 요청 이 정 보 를 되 돌려 주 는 데 시간 이 걸 리 면 이 프로 세 스 는 되 돌아 오 는 메 시 지 를 받 을 때 까지 기다 릴 것 입 니 다.
비동기 란 프로 세 스 가 계속 기다 릴 필요 가 없 이 다음 작업 을 계속 수행 하 는 것 을 말한다.다른 프로 세 스 의 상 태 를 막론하고.메시지 가 돌아 올 때 시스템 은 프로 세 스 에 게 처리 하 라 고 알 리 며 실행 효율 을 높 일 수 있 습 니 다.
예 를 들 어 전 화 를 걸 때 는 동기 통신 이 고,문자 메 시 지 를 보 낼 때 는 비동기 통신 이다.
단일 실행

from random import randint
from time import time, sleep


def download_task(filename):
    print('    %s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s    !    %d ' % (filename, time_to_download))


def main():
    start = time()
    download_task('Python  .pdf')
    download_task('av.avi')
    end = time()
    print('     %.2f .' % (end - start))


if __name__ == '__main__':
    main()
실행 은 순서대로 실행 되 기 때문에 여러 프로 세 스 의 시간 을 합 친 것 입 니 다.

단일 프로 세 스 작업 이기 때문에 모든 작업 이 줄 을 서서 진행 되 기 때문에 효율 이 매우 낮다.다 중 프로 세 스 모드 를 추가 하여 다 중 프로 세 스 를 동시에 실행 합 니 다.이 프로 세 스 가 실 행 될 때 다른 프로 세 스 는 기다 릴 필요 가 없 으 며 실행 시간 이 크게 짧 아 집 니 다.
다 중 프로 세 스

from random import randint
from time import time, sleep
from multiprocessing import Process
from os import getpid


def download_task(filename):
    print('      ,   :[%d]'%getpid())
    print('    %s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s    !    %d ' % (filename, time_to_download))


def main():
    start = time()
    p1 = Process(target=download_task,args=('python  .pdf',))
    p2 = Process(target=download_task,args=('av.avi',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    # download_task('Python  .pdf')
    # download_task('av.avi')
    end = time()
    print('     %.2f .' % (end - start))


if __name__ == '__main__':
    main()
여러 프로 세 스 가 나란히 실행 되 는데,총 시간 이 가장 오래 걸 리 는 프로 세 스 의 시간 입 니 다.

대략적인 집행 절 차 는 아래 그림 과 같다.

다 중 프로 세 스 의 특징 은 서로 독립 되 어 전역 변 수 를 공유 하지 않 는 다 는 것 이다.즉,한 프로 세 스에 서 전역 변 수 를 수정 한 후에 다른 프로 세 스 의 전역 변수 에 영향 을 주지 않 는 다 는 것 이다.
프로 세 스 간 통신

from random import randint
from time import time,sleep
from multiprocessing import Process
from os import getpid

time_to_download = 3
def download_task(filename):
    global time_to_download
    time_to_download += 1
    print('      ,   :[%d]'%getpid())
    print('    %s...' % filename)
    sleep(time_to_download)
    print('%s    !    %d ' % (filename, time_to_download))

def download_task2(filename):
    global time_to_download
    print('      ,   :[%d]'%getpid())
    print('    %s...' % filename)
    sleep(time_to_download)
    print('%s    !    %d ' % (filename, time_to_download))

def main():
    start = time()
    p1 = Process(target=download_task,args=('python  .pdf',))
    p2 = Process(target=download_task2,args=('av.avi',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    end = time()
    print('     %.2f .' % (end - start))


if __name__ == '__main__':
    main()
실행 결 과 를 통 해 알 수 있 듯 이 두 프로 세 스 간 의 전역 변 수 는 공유 할 수 없 기 때문에 서로 독립 된 것 입 니 다.

물론 다 중 프로 세 스 도 몇 가지 방법 을 통 해 데이터 공 유 를 할 수 있다.멀 티 프로 세 싱 모듈 의 Queue 를 사용 하여 다 중 프로 세 스 간 의 데이터 전달 을 실현 할 수 있 습 니 다.Queue 자 체 는 메시지 줄 프로그램 입 니 다.
Queue 에서 자주 사용 하 는 프로 세 스 통신 방법 두 가 지 를 소개 합 니 다.
put 방법 은 대기 열 에 데 이 터 를 삽입 하 는 데 사 용 됩 니 다.put 방법 은 두 개의 선택 가능 한 매개 변수 가 있 습 니 다:blocked 와 timeout.Blocked 가 True(기본 값)이 고 timeout 이 플러스 라면 이 방법 은 timeout 이 지정 한 시간 을 막 을 것 입 니 다.이 대기 열 에 남 은 공간 이 있 을 때 까지.시간 을 초과 하면 Queue.full 이상 을 던 집 니 다.Blocked 가 False 이지 만 이 Queue 가 가득 차 면 바로 Queue.full 이상 을 던 집 니 다.
get 방법 은 대기 열 에서 요 소 를 읽 고 삭제 할 수 있 습 니 다.마찬가지 로 get 방법 은 두 개의 선택 가능 한 매개 변수 가 있 습 니 다.Blocked 와 timeout.Blocked 가 True(기본 값)이 고 timeout 이 플러스 라면 대기 시간 내 에 원 소 를 찾 지 못 하면 Queue.Empty 이상 을 던 집 니 다.Blocked 가 False 라면 두 가지 상황 이 존재 합 니 다.Queue 에 값 이 있 으 면 바로 이 값 을 되 돌려 줍 니 다.그렇지 않 으 면 대기 열 이 비어 있 으 면 바로 Queue.Empty 이상 을 던 집 니 다.
Queue 대기 열 프로 세 스 간 통신 실현

from random import randint
from time import time,sleep
from multiprocessing import Process
import multiprocessing
from os import getpid

time_to_download = 3
def write(q):
    for i in ['python  ','av.avi','java  ']:
        q.put(i)
        print('      ,   :[%d]'%getpid())
        print('    %s...' % i)  
        sleep(time_to_download)

def read(q):
    while True:
        if not q.empty():
            print('      ,   :[%d]'%getpid())
            print('    %s...' % q.get())
            sleep(time_to_download)
        else:
            break

def main():
    q = multiprocessing.Queue()
    p1 = Process(target=write,args=(q,))
    p2 = Process(target=read,args=(q,))
    p1.start()
    p1.join()
    p2.start()
    p2.join()


if __name__ == '__main__':
    main()
이전 프로 세 스 가 기록 한 데 이 터 는 Queue 대기 열 을 통 해 다음 프로 세 스에 공 유 된 다음 프로 세 스 가 직접 사용 할 수 있 습 니 다.이렇게 하면 여러 프로 세 스 간 의 데이터 공 유 를 완성 할 수 있 습 니 다.

프로 세 스 풀
Pool 클래스 는 사용자 가 호출 할 수 있 도록 지정 한 프로 세 스 를 제공 할 수 있 습 니 다.새로운 요청 이 Pool 에 제출 되 었 을 때 풀 이 가득 차지 않 으 면 새로운 프로 세 스 를 만들어 요청 을 수행 합 니 다.풀 이 가득 차 면 요청 은 풀 에 프로 세 스 가 끝 날 때 까지 기 다 려 야 새로운 프로 세 스 를 만 들 수 있 음 을 알려 줍 니 다.
프로 세 스 풀 에서 흔히 볼 수 있 는 세 가지 방법:
◆apply:직렬
◆apply_async:병렬
◆map
다 중 스 레 드

from random import randint
from time import time, sleep
from threading import Thread
from os import getpid

def download_task(filename):
    print('      ,   :[%d]' % getpid())
    print('    %s...' % filename)
    time_to_download = randint(5, 10)
    sleep(time_to_download)
    print('%s    !    %d ' % (filename, time_to_download))

def main():
    start = time()
    p1 = Thread(target=download_task, args=('python  .pdf',))
    p2 = Thread(target=download_task, args=('av.avi',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    end = time()
    print('     %.2f .' % (end - start))

if __name__ == '__main__':
    main()
다 중 스 레 드 실행 은 GIL 잠 금 이 존재 하기 때문에 실제 실행 은 하나의 스 레 드,즉 한 번 에 하나의 스 레 드 만 실행 한 다음 에 다른 스 레 드 를 전환 하여 실행 합 니 다.그 중에서 전환 하 는 시간 이 매우 짧 기 때문에 다 중 스 레 드 와 함께 실행 하 는 것 처럼 보 입 니 다.

Thread 클래스 를 계승 하 는 방식 으로 사용자 정의 스 레 드 클래스 를 만 든 다음 스 레 드 대상 을 만 들 고 스 레 드 를 시작 합 니 다.

from random import randint
from threading import Thread
from time import time, sleep

class DownloadTask(Thread):
    def __init__(self, filename):
        super().__init__()
        self._filename = filename

    def run(self):
        print('    %s...'% self._filename)
        time_to_download = randint(5,10)
        sleep(time_to_download)
        print('%s    !   %d ' %(self._filename, time_to_download))

def main():
    start = time()
    t1 = DownloadTask('python  ')
    t2 = DownloadTask('av.avi')
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    end = time()
    print('    %.2f '%(end - start))

if __name__ == '__main__':
    main()
다 중 스 레 드 사용 클래스 인지 함수 가 실 행 된 결과 가 완전히 일치 합 니 다.구체 적 으로 어떻게 사용 하면 자신의 사용 장면 과 결합 할 수 있 습 니까?

파 이 썬 의 프로 세 스 와 스 레 드 에 대한 자세 한 설명 은 여기까지 입 니 다.파 이 썬 프로 세 스 와 스 레 드 에 관 한 더 많은 내용 은 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 부탁드립니다!

좋은 웹페이지 즐겨찾기