Python 다 중 프로 세 스 와 서버 병발 원리 및 용법 실례 분석

본 고의 실례 는 Python 다 중 프로 세 스 와 서버 의 병발 원리 와 용법 을 분석 하 였 다.여러분 께 참고 하도록 공유 하 겠 습 니 다.구체 적 으로 는 다음 과 같 습 니 다.
프로 세 스
프로 세 스 가 무엇 입 니까?
프로 세 스:진행 중인 과정 이나 작업 을 말 합 니 다.임 무 를 수행 하 는 것 은 cpu 다.
프로 세 스 와 프로그램의 차이
프로그램 은 단지 한 무더기 의 코드 일 뿐 이 고,프로 세 스 는 프로그램의 운행 과정 을 가리킨다.
병발 과 병행
병행 이 든 병행 이 든 사용자 가 보기 에는'동시'로 실 행 됩 니 다.프로 세 스 든 스 레 드 든 하나의 작업 일 뿐 입 니 다.정말 일 하 는 것 은 cpu 입 니 다.cpu 는 이 작업 을 수행 합 니 다.cpu 는 같은 시간 에 하나의 작업 만 수행 할 수 있 습 니 다.
동시 다발:가짜 병렬,즉 동시에 실행 되 는 것 처럼 보 입 니 다.하나의 cpu+다 중 기술 로 병행 할 수 있 습 니 다.(병행 도 병행 에 속 합 니 다)
2 병렬:동시에 실행,여러 cpu 가 있어 야 병렬 가능
단일 핵 에서 다 중 기술,다 중 핵 을 이용 할 수 있 고 모든 핵 도 다 중 기술 을 이용 할 수 있다(다 중 기술 은 단 핵 에 대한 것 이다)
네 개의 핵,여섯 개의 작업 이 있 습 니 다.같은 시간 에 네 개의 작업 이 실 행 됩 니 다.각각 cpu 1,cpu 2,cpu 3,cpu 4 에 배정 되 었 다 고 가정 합 니 다.
퀘 스 트 1 이 I/O 를 만나면 실행 을 중단 해 야 합 니 다.이때 퀘 스 트 5 는 cpu 1 의 시간 영 화 를 받 아 실행 합 니 다.이것 이 바로 단일 핵 에서 의 다 중 기술 입 니 다.
작업 1 의 I/O 가 끝나 면 운영 체 제 는 다시 호출 됩 니 다.
동기 화 와 비동기
동기 화 실행:한 프로 세 스 가 어떤 작업 을 수행 할 때 다른 프로 세 스 는 실행 이 끝 날 때 까지 기 다 려 야 계속 실행 할 수 있 습 니 다.
비동기 실행:한 프로 세 스 가 특정한 임 무 를 수행 할 때 다른 프로 세 스 는 실행 이 끝 날 때 까지 기다 리 지 않 아 도 계속 실행 할 수 있 습 니 다.메시지 가 돌아 올 때 시스템 은 후자 에 게 처리 하 라 고 알 립 니 다.그러면 실행 효율 을 높 일 수 있 습 니 다.
예 를 들 어 전 화 를 걸 때 는 동기 통신 이 고,문자 메 시 지 를 보 낼 때 는 비동기 통신 이다.
프로 세 스 생 성
하드웨어 라면 모두 운영 체제 가 관리 해 야 한다.운영 체제 만 있 으 면 프로 세 스 의 개념 이 있 고 프로 세 스 를 만 드 는 방식 이 있어 야 한다.일부 운영 체 제 는 하나의 응용 프로그램 만 을 위해 설계 해 야 한다.예 를 들 어 전자레인지 에 있 는 컨트롤 러 는 전자 렌 지 를 시작 하면 모든 프로 세 스 가 존재 한다.
유 니 버 설 시스템(많은 프로그램 을 실행)에 대해 서 는 시스템 운영 과정 에서 프로 세 스 를 만 들 거나 취소 하 는 능력 이 필요 합 니 다.주로 4 가지 형식 으로 나 뉘 어 새로운 프로 세 스 를 만 듭 니 다.
1.시스템 초기 화(프로 세 스 Liux 에서 ps 명령 을 사용 하고 windows 에 서 는 작업 관리자,프론트 프로 세 스 는 사용자 와 의 상호작용 을 담당 합 니 다.백 엔 드 에서 실행 되 는 프로 세 스 는 사용자 와 무관 하 게 백 엔 드 에서 실행 되 며 필요 할 때 만 깨 우 는 프로 세 스 를 데 몬 이 라 고 합 니 다.예 를 들 어 이메일,웹 페이지,뉴스,인쇄)
2.하나의 프로 세 스 가 실행 과정 에서 하위 프로 세 스 를 열 었 습 니 다(예 를 들 어 nginx 가 다 중 프로 세 스,os.fork,subprocess.Popen 등)
3.사용자 의 대화 형 요청 으로 새 프로 세 스 를 만 듭 니 다(예 를 들 어 사용자 가 폭풍 영상 을 두 번 클릭)
4.일괄 처리 작업 의 초기 화(대형 컴퓨터 의 일괄 처리 시스템 에서 만 적용)
어느 것 이 든 새 프로 세 스 의 생 성 은 이미 존재 하 는 프로 세 스 가 프로 세 스 를 만 드 는 시스템 호출 을 실행 하여 만 든 것 입 니 다.
1.UNIX 에서 이 시스템 호출 은:fork,fork 는 부모 프로 세 스 와 같은 복사 본 을 만 듭 니 다.두 사람 은 같은 저장 이미지,같은 환경 문자열 과 같은 파일 을 엽 니 다.(셸 해석 기 프로 세 스에 서 명령 을 실행 하면 키 프로 세 스 를 만 듭 니 다)
2.windows 에서 이 시스템 호출 은 CreateProcess,CreateProcess 는 프로 세 스 의 생 성 을 처리 할 뿐만 아니 라 정확 한 프로그램 을 새 프로 세 스 로 불 러 오 는 것 도 책임 집 니 다.
만 든 하위 프로 세 스,UNIX,windows
1.같은 것 은 프로 세 스 가 생 성 된 후 부모 프로 세 스 와 하위 프로 세 스 는 각각 다른 주소 공간(다 중 기술 은 물리 적 차원 에서 프로 세 스 간 메모리 의 격 리 를 요구 합 니 다)이 있 습 니 다.모든 프로 세 스 가 주소 공간 에서 의 수정 은 다른 프로 세 스에 영향 을 주지 않 습 니 다.
2.다른 것 은 유 닉 스에 서 하위 프로 세 스 의 초기 주소 공간 은 부모 프로 세 스 의 복사 본 입 니 다.알림:하위 프로 세 스 와 부모 프로 세 스 는 읽 기 전용 공유 메모리 영역 을 가 질 수 있 습 니 다.그러나 windows 시스템 에 서 는 처음부터 부모 프로 세 스 와 하위 프로 세 스 의 주소 공간 이 달 랐 다.
프로 세 스 종료
1.정상 적 인 종료(자원,예 를 들 어 사용자 가 대화 식 페이지 의 포크 번 호 를 클릭 하거나 프로그램 실행 이 완료 되면 시작 시스템 호출 이 정상적으로 종료 되 고 Liux 에서 exit 를 사용 하 며 windows 에서 ExitProcess 를 사용 합 니 다)
2.오류 종료(자원,python a.py 에 a.py 가 존재 하지 않 음)
3.심각 한 오류(자원 하지 않 고 불법 명령 을 수행 합 니 다.예 를 들 어 존재 하지 않 는 메모리,1/0 등 을 참조 하면 이상 을 포착 할 수 있 습 니 다.try..except..)
4.다른 프로 세 스에 의 해 죽 임(kill-9 와 같은 자원 하지 않 음)
하나의 프로 세 스 가 세 가지 상태 에서

포인트 가 왔 습 니 다.
python 병렬 프로 그래 밍 의 다 중 프로 세 스
multiprocessing 모듈 소개
python 의 다 중 스 레 드 는 다 중 핵 장점 을 이용 할 수 없습니다.다 중 핵 CPU 자원 을 충분히 사용 하려 면(os.cpucount()보기),python 에서 대부분의 경우 다 중 프로 세 스 를 사용 해 야 합 니 다.Python 은 매우 유용 한 다 중 프로 세 스 패키지 multiprocessing 을 제공 합 니 다.
multiprocessing 모듈 은 하위 프로 세 스 를 열 고 하위 프로 세 스에 서 맞 춤 형 작업(예 를 들 어 함수)을 수행 합 니 다.이 모듈 은 다 중 스 레 드 모듈 threading 의 프로 그래 밍 인터페이스 와 유사 합 니 다.
multiprocessing 모듈 의 기능 은 매우 많 습 니 다.하위 프로 세 스,통신 과 데이터 공유,서로 다른 형식의 동기 화 를 지원 하고 Process,Queue,Pipe,Lock 등 구성 요 소 를 제공 합 니 다.
다시 한 번 강조해 야 할 것 은 스 레 드 와 달리 프로 세 스 는 공유 상태 가 없습니다.프로 세 스 가 수정 한 데 이 터 는 이 프로 세 스 에 만 제 한 됩 니 다.
Process 류 소개
프로 세 스 클래스 만 들 기:Process([group [, target [, name [, args [, kwargs]]]]])이러한 예화 대상 은 하위 프로 세 스 의 작업(시작 되 지 않 았 음)을 표시 합 니 다.
강조:
1.키 워드 를 사용 하여 인 자 를 지정 해 야 합 니 다.
2.args 가 지정 한 target 함수 에 전달 하 는 위치 매개 변 수 는 원 그룹 형식 이 므 로 쉼표 가 있어 야 합 니 다.
  • group 매개 변 수 는 사용 되 지 않 았 고 값 은 항상 None
  • 입 니 다.
  • target 은 호출 대상,즉 하위 프로 세 스 가 수행 할 작업
  • 을 표시 합 니 다.
  • args 는 호출 대상 의 위치 매개 변수 모듈,args=(1,2,'egon',)
  • kwargs 는 호출 대상 의 사전 을 표시 합 니 다.kwargs={'name':'egon','age':18}
  • name 은 하위 프로 세 스 의 이름
  • p.daemon:기본 값 은 False 입 니 다.True 로 설정 하면 p 를 배경 으로 실행 되 는 데 몬 입 니 다.p 의 부모 프로 세 스 가 종 료 될 때 p 도 종 료 됩 니 다.그리고 True 로 설정 하면 p 는 자신의 새 프로 세 스 를 만 들 수 없습니다.p.start()전에 설정 해 야 합 니 다.p.name:프로 세 스 이름p.pid:프로 세 스 pidp.exitcode:프로 세 스 가 실 행 될 때 None 이 고 CN 이면 신호 N 에 의 해 끝 났 음 을 표시 합 니 다(알 면 됩 니 다)p.authkey:프로 세 스 의 인증 키 는 기본적으로os.urandom()무 작위 로 생 성 된 32 글자 의 문자열 입 니 다.이 키 의 용 도 는 네트워크 연결 과 관련 된 바 텀 프로 세 스 간 통신 에 안전성 을 제공 하 는 것 입 니 다.이러한 연결 은 같은 인증 키 를 가 질 때 만 성공 할 수 있 습 니 다(알 면 됩 니 다)
    하위 프로 세 스 열기
    
    import time
    import random
    from multiprocessing import Process
    def piao(name):
      print('%s piaoing' %name)
      time.sleep(random.randrange(1,5))
      print('%s piao end' %name)
    p1=Process(target=piao,args=('egon',)) #   , 
    p2=Process(target=piao,args=('alex',))
    p3=Process(target=piao,args=('wupeqi',))
    p4=Process(target=piao,args=('yuanhao',))
    p1.start()
    p2.start()
    p3.start()
    p4.start()
    print('   ')
    
    
    하위 프로 세 스 열기 2
    
    import time
    import random
    from multiprocessing import Process
    class Piao(Process):
      def __init__(self,name):
        super().__init__()
        self.name=name
      def run(self):
        print('%s piaoing' %self.name)
        time.sleep(random.randrange(1,5))
        print('%s piao end' %self.name)
    p1=Piao('egon')
    p2=Piao('alex')
    p3=Piao('wupeiqi')
    p4=Piao('yuanhao')
    p1.start() #start     run
    p2.start()
    p3.start()
    p4.start()
    print('   ')
    
    
    socket 서버 병행
    
    from socket import *
    from multiprocessing import Process
    server=socket(AF_INET,SOCK_STREAM)
    server.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
    server.bind(('127.0.0.1',8080))
    server.listen(5)
    def talk(conn,client_addr):
      while True:
        try:
          msg=conn.recv(1024)
          if not msg:break
          conn.send(msg.upper())
        except Exception:
          break
    if __name__ == '__main__': #windows start          
      while True:
        conn,client_addr=server.accept()
        p=Process(target=talk,args=(conn,client_addr))
        p.start()
    
    
    파 이 썬 관련 내용 에 관심 이 있 는 독자 들 은 본 사이트 의 주 제 를 볼 수 있다.
    본 논문 에서 말 한 것 이 여러분 의 Python 프로 그래 밍 에 도움 이 되 기 를 바 랍 니 다.

    좋은 웹페이지 즐겨찾기