파이썬 기준 (14 세) - 동시 프로그래밍

첫째, 운영 체제

참조 문서 : https://www.cnblogs.com/yuanchenqi/articles/6248025.html

둘째, 프로세스 및 스레드

2.1 소개 처리 할 수

공정 : 프로그램, 데이터 세트, 세 부분의 프로세스 제어 블록에 의해 일반적으로 동적 데이터 세트의 프로그램 실행 시간,

  • 절차 : 과정을 설명하는 데 사용하는 방법 완료하는 것을 완료하려면
  • 데이터 수집 : 프로그램의 실행 중에 자원을 사용할 필요가
  • 프로세스 제어 블록 : 기록 처리의 외부 특성, 프로세스에서 수행 된 변경 프로세스는 시스템의 관리 및 처리를 제어하기 위해 사용할 수있는 기술, 그것이 존재 감지 시스템 프로세스의 유일한 서명이며

2.2 스레드

주제 : 경량 공정, 그 기본적인 실행 유닛의 CPU 인 스레드 ID, 프로그램 카운터, 레지스터 세트에 의해, 프로그램 실행시의 최소 단위를 구성하고 스택. 스레드의 도입은 운영 체제의 동시 수행을 개선하는 프로그램의 동시 실행의 오버 헤드를 감소시킨다. 스레드는 자신의 시스템 자원을 가지고 있지 않습니다.

2.3 프로세스와 스레드의 차이

1) 적어도 하나 개의 프로세스의 프로그램, 프로세스는 적어도 하나의 스레드. (공정)은 컨테이너 스레드로 이해 될 수있다

2) 프로세스가 구현 과정에서 별도의 메모리 유닛과, 보유 공유 메모리의 다수의 스레드에 따라서 크게 프로그램의 효율을 향상.

3) 구현 프로세스 스레드 처리는 상이하다. 각 항목은 별도의 스레드 실행 순서 출구 수행 서열 및 절차를 가진다. 그러나, 스레드는 애플리케이션에 의해 제어되는 다수의 실행 스레드를 제공하는 용도에 따라 존재하며, 독립적으로 수행 할 수 없다.

4) 프로세스는 프로세스의 활동에 대한 한 세트의 데이터에서 실행 특정 개별 기능 프로그램은 독립형 시스템 장치 자원 할당 및 스케줄링된다.

5) 스레드는 물리적 공정 독립적. 기본적 스레드가 자신의 시스템 자원을 소유하지 않고 작동 할 기본 단위의 처리보다 작은 CPU 스케줄링 및 급전의 기본 단위 연산 만 요항으로,이다 (예를 들면 프로그램 카운터, 레지스터 및 스택의 세트와 같은) 리소스하지만 다른 스레드 프로세스들과 공유 될 수있는 자원을 모두 소유 한 프로세스에 속한다.

  6) 스레드는 생성되고 다른 스레드가 파괴 될 수 있으며, 동일한 공정에서 다수의 스레드에 걸쳐 동시에 실행할 수있다.

세, 파이썬 GIL

CPython과, 글로벌 통역 잠금 (全局 解释 器 锁), 또는 GIL에서 한 번에 파이썬 바이트 코드를 실행하는 여러 원시 스레드를 방지하는 뮤텍스이다. CPython과의 메모리 관리는 스레드로부터 안전하지 않습니다 주로하기 때문에 잠금이 필요합니다. 합니다 (GIL가 존재하기 때문에, 다른 기능은 적용하는 보증에 의존 성장해 왔습니다.)

핵심은 것을 의미 상관없이 시작 얼마나 많은 스레드, 당신은 하나 개의 스레드가 동시에 실행 수 실행시 CPU의 수, 파이썬이 없습니다

네, 파이썬 스레드와 스레드 모듈

4.1, 스레드는 방법을 호출

1) 직접 호출 모드

가져 오기 스레딩 
가져 오기 시간 

# 각 스레드 실행의 기능 정의 : DEF FUNC (NUM)는 
    ( "NUM 실행 ON : %의 S"%의 NUM) 인쇄 
    (. 3)을 time.sleep을 

된 IF __name__ == '__main__': 
    T1 = threading.Thread의 (목표 = FUNC, 인수의 = ( 1)) # 1 목표 = 주 함수 이름은 쓸 수 스레드 인스턴스를 생성 
    threading.Thread =의 T2 (목표 = FUNC, 인수의 = (2)) 

    ) (t1.start을 # 스레드 시작 
    t2.start () 

    인쇄 (t1.getName ()) # 스레드 이름을 가져 ==> 스레드 (1) 
    인쇄 (t2.getName ()) # 스레드 이름을 가져 ==> 스레드 2

2) 유전 호출

스레딩 가져 오기 
가져 오기 시간 

클래스 MyThread (threading.Thread) : 
    DEF는 __ (자체, NUM) __init : 
        threading.Thread는 .__ 초기화 __ (자기) # 부모 클래스 초기화 
        self.num이 NUM = 
    DEF RUN (자동) : # 각 스레드를 정의 실행하기 함수 이름은 실행되어야 
        ( "실행 NUM ON %의 S"%의 self.num) 인쇄 
        time.sleep (3). 

IF __name__ == '__main__' 
    T1 = MyThread. (1) 
    T2 = MyThread (2) 
    T1. () 시작 
    t2.start () 
    인쇄 ( "종료 ..........")

4.2 threading.Thread 예 방법

1) 제 (가입) : 자식 스레드가 수행을 완료하기 전에 자식 스레드 스레드의 부모가 차단됩니다

2) setDaemon를 (참) : 데몬 스레드는 방법은 시작 (호출하기 전에 설정해야합니다 당신이 데몬 스레드는 프로그램이 제한됩니다 중단 설정하지 않으면 스레드가) 선언됩니다. 이 방법은 기본이고 반대 가입 할 수 있습니다. 그들은 자식 스레드를 만들 경우 우리는 프로그램, 메인 쓰레드의 구현, 메인 스레드를 실행하면 메인 쓰레드와 두 힘에 각각 실행 자식 스레드는 메인 스레드가 종료 종료 할 때, 자식 스레드가 완료 여부를 테스트합니다 나누었다. 자식 스레드가 완료되지 않은 경우 자식 스레드가 종료되기 전에 완료 될 때까지, 메인 스레드가 대기합니다. 하지만 가끔은 우리가 함께 이탈은 단지 주 스레드에 관계없이 자식 스레드가 완료하는 여부에 종료되며, 메인 쓰레드해야해야합니다, 당신은 방법 setDaemon를 사용할 수 있습니다

수입 스레딩 
시간 가져 오기 ctime이에서, 수면 
수입 시간 

ListenMusic (이름) 정의 : 

        인쇄 (% (이름, ctime이 ()) ". % s이 (가) % s을 듣고 시작") 
        수면 (3) 
        (인쇄 % "%의 듣기 끝" ctime이는 ()) 

데프 RecordBlog (제목) : 

        인쇄 (이하 "% s을 (를) 기록 시작 %의!"% (제목, ctime이 ())) 
        수면 (5) 
        인쇄 ( '마지막 녹화 %의'% ctime이 ()) 

스레드 =을 [] #定义线程列表
T1 = threading.Thread (목표 = ListenMusic, 인수의 = ( 'AA')) 
T2 = threading.Thread (목표 = RecordBlog, 인수의 = ( 'BB')) 
threads.append (T1) 
threads.append (T2) 

: __name__ == '__main__ 간다면 

    스레드에 대한 t :  
        t.setDaemon를 (참) # 참고 : 시작하기 전에 설정해야합니다
        t.() 시작 
        ) (#의 t.join을
    t1.join () 
    #의 t1.setDaemon (참) 

    인쇄 (%의 ctime이 "%의 이상의 모든"())

3) 다른 방법

실행 () : # 스레드 스레드 객체가 자동으로 CPU 스케줄링 방법의 실행 된 후 실행되는 
시작 () : # 시작 스레드 활동. 
으로 isAlive는 () : # 스레드가 활성화 돌려줍니다. 
getName은 () : # 스레드의 이름을 돌려줍니다. 
에서는 setName () : 스레드 이름을 설정 #. 

어떤 방법 #threading 모듈을 제공합니다 
threading.currentThread () : # 현재 스레드 변수를 돌려줍니다. 
threading.enumerate () : #은 실행중인 스레드를 포함하는 목록을 반환합니다. 실행이 끝나기 전에, 그것은 시작 전과 종료 후 스레드를 포함하지 않는 시작 스레드를 말합니다. 
threading.activeCount는 () : # 실행 스레드의 수를 돌려줍니다 렌 (threading.enumerate ()) 같은 결과가 있습니다.

다섯째, 젠록

5.1 문제에 이르게

시간 가져 오기 
가져 오기 스레딩 

DEF ADDNUM () 
    , (주) 무료 # NUM 각 스레드의 모든 전역 변수를 얻을 가입 
    #의 NUM- 번호 최종 NUM = 1 : 0 

    임시 = NUM 
    #Print를 ( '- NUM을 GET', NUM) 
    시간. 동등한 작업 IO 슬립 (0.01), #는 스레드 스위치 
    NUM = 임시 -1- #이 공용 변수의 1 동작 

NUM = 공유 변수 설정 100 # 
thread_list = []을 
범위 I에 대해 (100) : 
    T = threading.Thread의 (대상 = ADDNUM) 
    t.start () 
    thread_list.append (T) 

thread_list에서 T에 대한 모든 스레드에 대한 # 대기가 완료 
    t.join () 

인쇄 ( '최종 NUM :'NUM) 

# 결과 
# 시간 .sleep을 (0.1) ==> 99 
# time.sleep (0.01) ==> 90에 나타나는 임의의 여러
 
# 이유 : 제 스레드 NUM = 100 상기 time.sleep, 스레드 스위치, 제받을 때 또는 100 스레드를 얻기 위해, 그는 NUM의 몇 가지를 얻을 수있는 첫 번째 스레드를 몰랐다
# 마찬가지로 time.sleep 번째 스레드, 스레드 스위치 또는 제 100받을 때

5.2 문제 해결

추천

출처www.cnblogs.com/hujinzhong/p/11517535.html