파이썬 세부 사항을 멀티 스레딩

  멀티 스레드 파이썬은 매우 중요한 지식, 우리뿐만 아니라 테스트와 같은 지식의 코드 다중 스레드 주석의 예제와 함께 자세히 설명 된 바와 같이 멀티 스레드 오늘.

  수입 스레딩

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

  수입 시간의

  '' '

  자세한 파이썬 멀티 스레딩

  스레드는 무엇인가?

  또한 경량 프로세스라고도 쓰레드는 운영 시스템은 프로세스에 포함되는 상기 단위 공정의 실제 동작이다 스케줄링 동작 할 수있는 최소 단위이다.

  필수 자원의 운영에 조금 밖에있다, 그들은 시스템 자원이없는 스레드,하지만 다른 스레드의 프로세스와 프로세스를 공유 할 수는 속할 수

  그것은 모든 자원을 가지고있다. 스레드는 생성되고 다른 스레드가 동일한 공정에서 다수의 스레드를 동시에 실행할 수 통해 파괴 할 수있다

  '' '

  '' '

  왜 멀티 스레딩 사용합니까?

  스레드 프로그램 동시 스트림의 구현에 독립적이다. 분리 공정과 비교하여, 처리의 스레드 간의 분리 정도가 작고, 이들은 메모리, 파일 핸들을 공유

  그리고 다른 프로세스가 명시해야한다.

  스레드의 분할은, 그래서 멀티 스레드 프로그램 동시성 높은 프로세스보다 작은 스케일 때문에. 프로세스는 실행 과정에서 별도의 메모리 유닛을 구비하고, 다수의 스레드에 의해 공유

  메모리는 크게함으로써 프로그램의 효율을 향상.

  스레드는 공통적으로 가지고있는 여러 스레드가 가상 공간을 공유 처리 같은 프로세스에서 스레드로 인해 과정,보다 높은 성능을 가지고있다. 공유 환경 스레드

  프로세스 코드 세그먼트, 전체 공정 데이터, 이러한 공유 데이터의 사용을 포함, 스레드 간의 통신을하기 쉽습니다.

  당신은 운영 체제 프로세스를 만들 때, 개혁 과정은 별도의 메모리 공간에 할당하고, 많은 자원을 할당하지만 스레드를 만들 훨씬 간단해야합니다. 따라서, 멀티 스레딩의 사용

  공연 비가 더 높은 것으로 여러 프로세스의 병용을 실현한다.

  '' '

  '' '

  요약하면, 멀티 스레드 프로그래밍의 사용은 다음과 같은 장점이 있습니다 :

  당신은 아주 쉽게 스레드와 프로세스 간의 메모리,하지만 공유 메모리를 공유 할 수 없습니다.

  당신은 운영 체제 프로세스를 만들 때 필요 프로세스에 시스템 리소스를 재 - 할당하지만, 비용이 적은 스레드를 만들 정도입니다. 따라서, 멀티 스레딩의 사용을 달성하는 멀티 태스크의 동시 실행은 다수의 공정을 이용하여보다 효율적

  파이썬 언어 지원이 내장 된 멀티 스레딩 기능, 단순히 기본 운영 체제 스케줄링과 같은보다, 파이썬에서 멀티 스레드 프로그래밍을 단순화.

  '' '

  '' '

  일반적인 방법 만들기

  '' '

  # 데프 실행 (N) :

  # 인쇄 ( '작업', N)

  # time.sleep (1)

  # 인쇄 ( '2 초')

  # time.sleep (1)

  # 인쇄 ( '1 초')

  # time.sleep (1)

  # 인쇄 ( '0')

  # time.sleep (1)

  #

  # 경우 __name__ == '__main__':

  # T1 = threading.Thread (목표 = 실행 인수 = ( 'T1')) # 목표 함수 이름 () 함수를 실행하기 위해 인수 튜플의 형태에 관련된 파라미터의 함수이다

  T2 = # threading.Thread (목표 = 실행 인수 = ( 'T2'))

  # t1.start ()

  # t2.start ()

  '' '

  사용자 스레드가 : Thread 클래스의 실행 방법의 재건은 스레드 클래스 상속은 본질적으로 정의하는 threading.Thread입니다

  '' '

  # 클래스 MyThread (threading.Thread) :

  # 데프 __init __ (자기, N) :

  # 슈퍼 (MyThread, 자기) .__ 초기화 __ () # 기능은 복원 실행을 작성해야합니다

  # = N self.n

  #

  # 데프 (자동)를 실행 :

  # 인쇄 ( '작업', self.n)

  # time.sleep (1)

  # 인쇄 ( '2 초')

  # time.sleep (1)

  # 인쇄 ( '1 초')

  # time.sleep (1)

  # 인쇄 ( '0')

  # time.sleep (1)

  #

  # 경우 __name__ == '__main__':

  T1 = # MyThread ( 'T1')

  T2 = # MyThread ( 'T2')

  # t1.start ()

  # t2.start ()

  '' '

  데몬 스레드

  모든 아이가 스레드가 데몬 스레드 주 스레드되었다 (참) 여기에 사용 된 다음의 예, setDaemon를,

  메인 스레드의 끝, 자식 스레드가 종료됩니다 그래서 그렇게 할 때 메인 스레드의 끝, 전체 프로그램이 종료됩니다.

  메인 스레드에 관계없이 쓰레드의 구현 인 이른바 '스레드 가드',만큼 자식 스레드 종료하고 다른 메인 쓰레드가 끝나면, 메인 스레드는 종료됩니다. 즉 : 메인 스레드가 울리도록 할 데몬 스레드의 실행이 완료 기다리지 않습니다.

  '' '

  # 데프 실행 (N) :

  # 인쇄 ( '작업', N)

  # time.sleep (1)

  # 인쇄 ( '3S')

  # time.sleep (1)

  # 인쇄 ( '2 초')

  # time.sleep (1)

  # 인쇄 ( '1 초')

  #

  # 경우 __name__ == '__main__':

  # t = threading.Thread (목표 = 실행 인수 = ( 'T1'))

  # t.setDaemon (참)

  # t.start ()

  # 인쇄 ( '말')

  '' '

  끝이 자식 스레드가 즉시 종료됩니다 때 데몬 스레드 주 스레드를 설정 한 후 결과를 볼 수있는 바와 같이, 실행되지

  '' '

  '' '

  자식 스레드 완료의 메인 스레드 대기

  스레드 주 스레드 다음 말 종료 후 가드을 수행하기 위해, 우리는이 방법을 결합 사용할 수 있도록 그 자식 스레드 실행을 위해 메인 스레드 대기

  '' '

  # 데프 실행 (N) :

  # 인쇄 ( '작업', N)

  # time.sleep (2)

  # 인쇄 ( '5 초')

  # time.sleep (2)

  # 인쇄 ( '3S')

  # time.sleep (2)

  # 인쇄 ( '1 초')

  # 경우 __name__ == '__main__':

  # t = threading.Thread (목표 = 실행 인수 = ( 'T1'))

  # T.setDaemon는 데몬 스레드를 처리하는 스레드 (참) #)을 (를 시작하기 전에 설정해야합니다

  # t.start ()

  # T.join는 () # 자식 스레드 엔드 메인 스레드 대기하는 시간을 설정

  # 인쇄 ( '말')

  '' '

  멀티 스레드 전역 변수를 공유

  실행의 최소 단위는 프로세스 실행 부 스레드, 시스템 자원 할당 방법, 동일한 과정이므로 여러 스레드가 공유 자원 때

  '' '

  # = 100 g_num

  # 데프 근무처 () :

  # 글로벌 g_num

  범위의 I # (3) :

  # + 1 = G_num

  # 인쇄 ( '근무처의 g_num에서이다 % D'g_num %)

  #

  # 데프 근무처 () :

  # 글로벌 g_num

  # 인쇄 ( '근무처의 g_num에서이다 % D'g_num %)

  #

  # 경우 __name__ == '__main__':

  T1 = # threading.Thread (목표 = 근무처)

  # t1.start ()

  # time.sleep (1)

  T2 = # threading.Thread (목표 = 근무처)

  # t2.start ()

  '' '

  이 스레드 간의 임의의 스케줄링은, 각각의 스레드 만 N 바를 수행 한 후에 수행 될 수 있기 때문에 다수의 스레드가 동시에 동일한 데이터를 수정할 때 더티 데이터가 발생할 수 있고,

  그래서 작업을 수행하기 위해 한 번에 하나 개의 스레드를 할 수있는 스레드 잠금이 있었다. 배타적 필요할 때 프로세서 쓰레드 로크가 리소스를 잠그는 잠금 복수의 다음 번호로 정의 될 수있다

  특정 자원이 어떤 잠금 리소스를 잠글 수 있습니다 때 당신이 다른 잠금을 사용하는 것보다, 같이 도어 잠금 장치와 같은 방식으로 지정할 수 있습니다.

  이 스레드 사이의 임의의 일정이기 때문에 여러 스레드가 동시에 객체를 조작이있는 경우, 객체가 잘 보호되어 있지 않은 경우, 소송 절차의 예기치 않은 결과가 발생할 수 있습니다

  따라서 우리는 또한 "스레드 안전"이라고합니다.

  위의 상황을 방지하기 위해 뮤텍스 잠금이 있었다 (잠금)

  '' '

  # 데프 일 () :

  전반적인 중 #

  # lock.acquire ()

  # 온도 = N

  # time.sleep (0.1)

  # N-1 = 임시

  # lock.release ()

  #

  #

  # 경우 __name__ == '__main__':

  # 잠금) (잠금 =

  # N = 100

  # L = []

  범위의 I # (100) :

  # p = 스레드 (목표 = 일)

  # l.append (p)

  # p.start ()

  L에서 P에 대한 # :

  # p.join ()

  '' '

  재귀 잠금 : RLcok 클래스 사용 및 잠금 클래스는 동일하지만, 여러 잠금이 해제되지 않을 때 그것은 일반적으로 RLock 클래스를 사용하여 중첩 된 지원

  '' '

  # 데프 FUNC (잠금) :

  # 글로벌 gl_num

  # lock.acquire ()

  # + 1 = Gl_num

  # time.sleep (1)

  # 인쇄 (gl_num)

  # lock.release ()

  #

  #

  # 경우 __name__ == '__main__':

  # = 0 gl_num

  잠금 #) (= threading.RLock을

  범위의 I # (10) :

  # t = threading.Thread (목표 = FUNC, 인수 = (로크))

  # t.start ()

  '' '

  세마포어 (BoundedSemaphore 클래스)

  뮤텍스는 동시에 세마포어는 피트 화장실 3과 데이터를 변경하는 스레드의 특정 수를 허용하는 동안 하나의 스레드 만이 데이터를 변경시키면서

  사람들은 다시 입력 순서로 누군가가 내 뒤에 기다리는 화장실 3 명 최대가 허용

  '' '

  # 데프 (N, 세마포어)를 실행 :

  # Semaphore.acquire () # 잠겨

  # time.sleep (3)

  # 인쇄 ( '스레드 실행 : %의 \ n'% n을)를

  # Semaphore.release () # 출시

  #

  #

  # 경우 __name __ == '__main__':

  # 민 = 0 정주 군중 병원 어느 것이 더 나은 http://www.zzzy120.com/입니다

  # 세마포 = threading.BoundedSemaphore 오 개 스레드 (5) # 최대 동시 실행

  범위의 I # (22) :

  # t = threading.Thread (목표 = 실행 인수 = ( 'T- % S'% 나 세마포어))

  # t.start ()

  # 동안 threading.active_count () = 1! :

  # 통과하다

  # 다른 사람 :

  # 인쇄 ( '---------- 모든 스레드가 완료 -----------')

  '' '

  제어의 다른 스레드를 수행 할 수있는 메인 스레드에 대한 이벤트의 파이썬 스레드, 이벤트는 여러 가지 방법이 주로 다음을 제공, 간단한 스레드 동기화 개체입니다 :

  플래그를 취소하는 것은 False로 설정

  True로 플래그 설정

  is_set는 플래그 여부를 판정한다

  하지 감지 플래그 상태가 차단 된 경우 대기는 플래그를 청취 한 것

  이벤트 처리 메커니즘 : 값이 거짓 일 때 글로벌 깃발, 플래그 정의 다음 event.wait (가) 플래그 값에 해당하는 경우 차단됩니다,

  event.wait ()가 더 이상 차단되지 않습니다 그래서

  '' '

  이벤트 threading.Event = ()

  데프 라이터 () :

  카운트 = 0

  사람들에게 event.set () # 초기 녹색 빛 사람

  진정한 동안 :

  만약 5 <카운트 <= 10 :

  event.clear () # 붉은 빛, 명확 플래그

  인쇄 ( "\ 33 [41] lmred 빛이에 ... \ 033 0m]")

  ELIF 수> 10 :

  event.set () # 그린, 세트 플래그

  카운트 = 0

  그밖에:

  ( '\ 33 [42] lmgreen 빛에 ... \ 033 0m 인')를 인쇄

  time.sleep (1)

  카운트 + 1 =

  데프 자동차 (이름) :

  진정한 동안 :

  event.is_set ()는 경우 #는 플래그 여부를 판정한다

  인쇄 ( '[% S] 실행 .....'% 이름)

  time.sleep (1)

  그밖에:

  ( '대기, 붉은 빛을 본다 [% S] ...'% 이름) 인쇄

  event.wait ()

  인쇄 ( '가는 시작, [% S] 녹색 등이 켜져 ...'% 이름)

  # = startTime을로 time.time ()

  광 = threading.Thread (목표 = 라이터)

  light.start ()

  자동차 = threading.Thread (목표 = 차 인수 = ( 'MINT'))

  car.start ()

  endTime- 사용자로 time.time = ()

  # 인쇄 ( '用 时 :'endTime- 사용자 - startTime을)

  '' '

  GIL 글로벌 통역

  비 파이썬 환경에서 싱글 코어의 경우는 하나의 작업을 수행 할 수있다. 때 멀티 코어는 동시에 여러 개의 스레드를 지원할 수 있습니다. 그러나 파이썬에서, 아니 얼마나 많은 코어를 중요

  동시에 당신은 단지 하나 개의 스레드를 실행할 수 있습니다. 그 이유는 GIL의 존재 때문이다.

  GIL 글로벌 파이썬 소스가 만든 데이터 보안 결정을위한 설계의 시작으로 간주됩니다 전체 인터프리터입니다. 수행 할 스레드가 먼저 GIL을 받아야합니다, 우리는 할 수

  GIL는 "통과"로 간주하고, 파이썬 과정에서 GIL 단지 하나이다. 스레드 패스 가져 오기를 파이썬 프로세스가 GIL은 단 하나,

  스레드를 전달받을 수없는 CPU에 허용되지 않았다. 그가 직접 말할 수 있도록 GIL은, CPython의 호출이 언어 C 원시 스레드에만 있기 때문에에 CPython과

  CPU로,하지만 우리는 단지 데이터를 얻을 수있는 동시에 하나 개의 스레드 만 GIL 보증을 사용할 수 있습니다. pypy과에는 JPython에는 GIL이다

  멀티 스레드 사용할 때 파이썬, 기본 과정은 C 언어라고합니다.

  '' '

  '' '

  코드 실행 효율의 다른 유형을위한 파이썬은 다르다

  1 CPU 집약적 코드 (각종 루프 처리, 연산 등),이 경우, 복수의 계산 이후 기술 곧 다음 GIL의 시작 임계치에 도달 할 틱

  해제 한 후 CPU를 많이 사용하는 코드를 파이썬 (스위치 백 물론 앞으로 여러 스레드 자원을 소비 할 필요), 그래서 여러 스레드를 경쟁하는 것은 쉬운 없습니다.

  2, IO 집중적 인 코드를 효과적으로 IO의 단일 스레드 때까지 기다려야합니다 멀티 스레딩 (IO 작업의 효율성을 향상시킬 수 있습니다 (파일 처리, 웹 크롤러 설계 파일 읽기 및 쓰기 작업)

  시간이 불필요하게 낭비의 결과로, 대기가 자동으로 스레드 B로 전환 스레드 A에서 여러 스레드를 열 수 있습니다, 당신은 프로그램의 실행을 향상시킬 수있는 CPU 리소스를 낭비하지 수

  효율성). 파이썬 IO 집약적 인 코드에 더 친화적 인 멀티 스레딩 그래서.

  '' '

  '' '

  주로 태스크의 유형에 따라, 우리로 나뉘어 태스크는 I / O 집약적 연산 집약적, 멀티 스레드는 핸드 오버에 I / O 스위칭 시간 스위치들로 분할된다. 작업이 속하는 경우에, / O 집약적 인 I입니다

  멀티 스레딩을 사용하지 않고, 우리가 I / O 조작이 I / O 작업이 대기 과정에서 수행 할 수 있습니다 뒤에 완료 전면 I / O 작업을 기다릴 수밖에 없다 실시, CPU는 대기에

  국가는 멀티 스레딩 다음 경우, 다음, 또 다른 I / O 작업으로 전환합니다. 당신은 그냥 피하기 CPU에 CPU를 활용할 수 있도록 유휴 상태 및 효율성을 향상시킬 수 있습니다. 하지만

  작업이 유형을 계산 다중 스레드 경우, CPU 스위치 스레드에 시간 스위치를 멀티 스레딩 방식을 취할 일정 시간이 끝날 때까지 작업을 수행했을과 CPU가 근무 조건에있다,

  태스크 전환시 성능 멀티 스레드 대향 개선되지 않는 이러한 상황에서, 또한 성능 저하를 초래 시간과 자원의 낭비를 초래할 수있다. 이러한 두 멀티 스레드 결과 위의 설명 할 수없는 의해 야기된다.

  결론 : I / O 집약적 인 작업, 멀티 스레드, 다중 프로세스 + 코 루틴으로도 사용할 수있다 권장 (예를 들어 : 다중 이용 데이터 크롤러는 멀티 스레드 처리를 크롤링), 연산 집약적 인 작업이 시간이 아니다 파이썬 적용됩니다.

  '' '


추천

출처blog.51cto.com/14503791/2484319