검토 펀치 --0821 멀티 스레딩

 동시 병행

동시성 : 작업 예약 시스템을 통해 작업의 수> CPU 코어 수, 앞뒤로과, 스위칭 실행은, 사실, 정말 함께 실행할 수 없습니다, 단지 매우 빠른 실행으로 전환 "과"여러 개의 작업을 달성하기는 함께 수행 할 나타납니다 그것의;

병렬 : 작업 <= CPU 코어 수의 수는 실제와 동시에 실행된다.

동기화 : 동기화 코드가 IO 작업을 호출하는 시간을 의미, IO 작업이 유일한 방법은 오직 하나의 메인 라인을 반환 호출의 완료를 기다려야합니다;

비동기 : 비동기 복귀의 완료를 기다리지 않고 코드가 IO 작업을 호출하는 시간, IO 작업을 말합니다 만, 메인 라인의 숫자가있는 방법으로 호출;

에서 스레딩 수입 스레드
 수입 시간

데프 (재미) 타이머 :
     데프 (* 인수, ** 래퍼 kwargs로) :
        TIME1 = 로 time.time ()
        재미 ( * 인수, ** kwargs로)
        TIME2 = 로 time.time ()
         인쇄 ( " 시간의 함수로 현재 : {} " .format (time2- TIME1))
         반환 time2- TIME1의
     반환 warpper

DEF 근무처 ()
    에 대한 I  범위 (6 ) :
        time.sleep ( . 1 )
         인쇄 (F를 ' 의 급수 시간들 {I} ' )

DEF : 근무처 (이름)
    에 대한 I  범위 (5 ) :
        time.sleep ( . 1 )
         인쇄 (F를 ' 시간의 {난} {이름}가 벽에 부딪 ' )

# 동기 작업은 더 11S보다 필요, 다음 
@timer
 DEF 주 () :
    근무처 ()
    근무처 () 

# 비동기 작업 만 멀티 기가 
@timer
 DEF ) 메인 2를 (:
    T1 = 스레드 (목표 = WORK2, 인수 = ( 'Musen') )   # 파라미터 실행 기능의 스레드 또는 전달 스레드 (목표 = WORK2, kwargs로를 = { '이름' 'Musen'} )이 매개 변수 전달 모드
t1.start () # 초기 준비와 반드시 메인 쓰레드 후 실행되지 새로운 스레드의 실행, 메인 스레드가 선행 할 수있다  인쇄 ( " 벽 비동기 작업 실행에 충돌 " 메인 2) 근무처 () () (주)

모듈 스레딩은 설명합니다 :

스레드 객체 생성 : T1 = threading.Thread을 (목표 = FUNC) FUNC은 특정 스레드의 실행 태스크의 함수이다

Thread 클래스 일반적인 방법, 속성 :

1 .start () : 스레드 활동을 시작합니다.
2. RUN () :이 방법은 설명 스레드 활성은 서브 클래스에서이 메소드를 재정의 할 수있다.
3. (가) (시간 제한 = 없음)에 참여하지 : 메인 스레드가 계속 실행 하위 스레드 실행의 마지막을 기다리는 설정합니다. 당신은 무한 대기를 방지하기 위해, 시간 제한 매개 변수를 설정할 수 있습니다. 두 개의 스레드가 주문을 완료 할 수 있기 때문에, 소위 스레드 같은 외모 스레드를 합병했다.
시간 제한을 설정하려면 매개 변수는 차단 과정에 참여하지 않습니다 더 지정된 시간보다 인 참여로 전달에 의해. 시험의 실제 응용 프로그램에서, 모든 제한 시간 내에 쓰레드가 끝난하지 않는 것이 발견 되었으나, 실행 순서는 예를 들어, 타임 아웃이 전체의 부재에서 스레드의 앞에, 2 초에 설정되어 TIME_OUT 시간에 제한 시간 확인 다음 타임 아웃 2S 설정 이후의 시간의 끝에서 다른 스레드에 가입 할 실행 스레드 하였다.
4.name : 스레드 이름
5.getname () : 반환 스레드 이름
6.setname () 스레드 집합 이름
7.ident : 스레드 식별자
8.is_alive () 스레드는 리턴 활성
부울 값을 나타냄 9.daemon 이 스레드는 데몬 스레드 인 경우

threading.active_count ()는 이 기능이 값은 또한 프로그램리스트와 같은지, 현재 스레드의 수를 반환 

threading.current_thread () : 반환 현재 스레드 객체

threading.enumereate는 () : 현재 실행중인 스레드의 목록을 반환

threading.main_thread () : 메인 스레드에 복귀, 정상적인 상황에서, 메인 스레드는 스레드가 때 파이썬 인터프리터를 실행을 시작한다는 것입니다.

# 스레드 클래스 정의
가져 오기
시간 에서 스레딩 가져 오기 스레드 데프 (재미) 타이머 : 데프 (* 인수, ** 래퍼 kwargs로) : TIME1 = 로 time.time () 재미 ( * 인수, ** kwargs로) TIME2 = 로 time.time () 인쇄 ( " 시간의 함수로 현재 : {} " .format (time2- TIME1)) 반환 time2- TIME1의 반환 warpper 클래스 MyTread (나사) :
   데프 __init __ (자기) :
    슈퍼 () .__ 초기화 __ (* 인수, ** keargs)
    self.url = URL
데프 실행 (자동) : 헤더 = { " 사용자 에이전트 " : " 모질라 / 5.0 (윈도우 NT 10.0; Win64를; 64) AppleWebKit / 537.36 (KHTML, 도마뱀 붙이 등) 크롬 / 75.0.3770.80 afari / 537.36 " } 에 대한에서 범위 (100 ) #res = requests.get ( ' https://www.baidu.com ' , 헤더 = 헤더)
     고해상도 = requests.get (URL = self.url, 헤더 = 헤더) 
인쇄 (고해상도) @시간제 노동자 데프 주 () : t_list = [] 에 대한 I 범위 (10 ) : #T = MyTread ()
     t = MyTread ( 'https://www.baidu.com') t.start ()
# 여기에 배치하는 경우는 단일 스레드 실행이 될 것이다 T.join (), 완전한 재 빌드를 자식 스레드를 수행 # 트래버스 모든 자식 스레드, 아이는 메인 쓰레드들의 실행 후 수행하는 모든 설정을 스레드 에 대한 J 에서 t_list : j.join () 경우 __name__ == " __main__ " : 본관()

멀티 스레딩, 변경 전후 스레드 스위칭 만 동시 일 수 달성 평행 불가능한 멀티 스레딩 파이썬 자원에 대한 경쟁이, 따라서 동일한 프로세스를 생성한다 (동일한 메모리 부분을 사용하여) 전역 변수를 공유 할 수있다.

스레드 그 사이 작업은 스위치의 원인이됩니다?

자동 스위치를 스레드 것, 네트워크, 파일 및 기타 시간이 많이 걸리는 입력 IO 작업; 1. IO는 작업을 소모

실행 시간이 소정의 임계 값에 도달 할 때 2 스레드 스위칭이 실행되고;

1000000 버그가 해결 :

1. 록 처리

2. 가게 할 큐

에서 스레딩 수입 스레드, 잠금
= 0

데프 근무처 () : 
글로벌 NUM
에 대한에서 범위 (1000000 ) meta.acquire () # 1 고정 NUM + 1 = 메타 ()가 .release #를 잠금 해제 데프 근무처 () :
   글로벌 NUM
에 대한에서 범위 (1000000 ) meta.acquire () # 1 고정 NUM + 1 = 메타 ()가 .release # 잠금 해제 메타 = 잠금 () #가 로크를 만들 데프 주 () : T1 = 스레드 (목표 = 근무처) T2 = 스레드 (목표 = 근무처) t1.start () t2.start () t1.join () t2.join () 인쇄 (여부) 경우 __name__ == ' __main__ ' : 본관()

GIL 글로벌 통역 잠금 :

IO 집약적 인 작업 : CPU 소형 풋 프린트의 IO 작업의 시간 대기의 대부분. 이는 멀티 스레딩 수행됩니다

CPU 집약적 인 작업 : CPU 점유율 및 더 많은 컴퓨팅을 많이 필요로한다. 이는 단일 스레드 수행됩니다.

GIL로에 대한 몇 가지 설명 :

1.python 언어와 GIL은 중요하지, 단지 인해 CPython의 가상 머신 (인터프리터)에있는 과거 이유로 않습니다, GIL을 제거하기가 어렵습니다;

2.GIL : 글로벌 통역 잠금, GIL을 얻을 수있는 모든 필요의 구현에 각 스레드, 하나의 스레드가 코드를 실행 할 수 있도록;

IO 및 기타 작업은 시스템 호출을 차단 될 수 있습니다 전에 경우 GIL가 구현 GIL를 받아야 후 일시적으로 타이머를 사용하여, python3 실행 시간을 GIL을 해제 할 수 있습니다, 잠금을 해제 스레드 (3)은 임계 값 (python2 사용 티켓에 도달 카운트에 도달 100) 현재 쓰레드 분리 GIL

멀티 프로세스 멀티 코어 CPU 자원을 이용할 수있다 4. 파이썬

교착 상태 :

멀티 스레드에서 스레드가 같은 뮤텍스 자원의 단독 소유에 의해 보장 될 수 있지만, 프로그램이 복잡하게 한 후, 스레드 A 리소스 A의 잠금 및 사용 자원 B의 필요성 뒤에 스레드에서 나타날 수 있습니다, 의지의 잠금을 해제 자원 전에 사용하고, B 자원에 대한 스레드 B가 잠겨, 그것 뒤에 자원을 사용하도록 선택할 사용 후에 동시에 스레드 A와 스레드 B가 실행, 그것은 발생할 수있는 경우, B는 잠금을 해제합니다 경우, • 스레드도 잠금 해제에 스레드 A 스레드 B를 기다리고, 잠금 해제에 나사 B를 기다리고있다,이 교착 상태입니다.

해결 방법 : 교착 상태 문제는 프로그램을 설계 할 때 피하거나 프로그램이 교착 상태 발생 여부를 감지 할 수있는 대기 시간 제한을 추가하고, 다른 하나는 은행의 알고리즘도 피할 교착 통해해야

은행의 알고리즘 : 사고 은행가 알고리즘 은행이 $ 10이 있다고 가정, 이번에 3 개 위안 대출 9 개 위안 대출, B 세 개인 대출, A가 있습니다, C는 $ 8이 시간, 은행 것이다 확실히 충분히 빌려 싶어 모두 충족, 은행의 알고리즘을 태어났다

그런 다음 모든 은행이 고객을 유지하고 자신의 돈이 부족하지 않도록하기 위해, 그들은 2위안 2 위안 B를 빌려, 일괄 적으로 고객에게 빌려, C 4위안 2 위안,이 시간이 바로 B를 좌안 B이 부족하면 필요가 자신의 요구를 충족 하나의 위안 빌려, 은행이 그에게 $ 1 빌려주는 것, 자신의 $ 1, 다음, C, C를 빌려하는 삼위안, 사위안 은행 후에 은행에 반환 왼쪽 상환 등 C 후 만족하고 8위안 7위안은 세 가지 동적 고객의 수요를 충족 그래서, 빌려준 것

프로그램에서 은행의 알고리즘은 실제로 은행 대출의 과정을 시뮬레이션, 동적으로 개별 스레드에 자원을 할당 할 운영 체제, 유통 전에 할당을 결정하는 시스템은 불안의 상태를 입력 할뿐만 아니라이 시스템의 원인이됩니다 스레드에 자원을 할당하는 것은 스레드는 대기를 만들 것입니다

추천

출처www.cnblogs.com/qingyuu/p/12255578.html