Python 은 threading 으로 다 중 스 레 드 상세 해 를 실현 합 니 다.

다 중 스 레 드
다 중 스 레 드 는 프로그램의 운행 효율 을 높이 는 좋 은 방법 이다.원래 순서대로 실행 해 야 하 는 프로그램 은 현재 병행 실행 할 수 있 으 므 로 효율 이 많이 향상 되 어야 한 다 는 것 을 짐작 할 수 있다.그러나 다 중 스 레 드 도 모든 프로그램의 효율 을 높 일 수 있 는 것 은 아니다.프로그램의 두 극단 은'CPU 밀집 형'과'I/O 밀집 형'두 가지 이다.다 중 스 레 드 기술 은 후자 에 비교적 적용 된다.직렬 구조 에서 디스크 나 네트워크 통신 을 읽 을 때 CPU 는 한가 하기 때문이다.왜냐하면 네트워크 는 디스크 보다 몇 개의 수량 급 이 느 리 고 디스크 는 내부 저장 보다 몇 개의 수량 급 이 느 리 며 메모리 가 CPU 보다 몇 개의 수량 급 이 느 리 기 때문이다.다 중 스 레 드 기술 을 동시에 실행 할 수 있 습 니 다.예 를 들 어 프로그램 은 http 패 킷(10 초)을 보 내야 합 니 다.한 위치 에서 다른 위치(20 초)로 파일 을 복사 해 야 합 니 다.그리고 다른 파일 에서'hello,World'문자열 의 출현 횟수(4 초)를 통계 해 야 합 니 다.지금 은 모두 34 초 입 니 다.그러나 이 조작 들 사이 에는 관련 이 없 기 때문에 다 중 스 레 드 프로그램 으로 쓸 수 있 고 거의 20 초 만 에 완성 된다.이것 은 I/O 집약 형 을 겨냥 한 것 으로 CPU 집약 형 이 라면 안 된다.예 를 들 어 제 프로그램 은 1000 의 곱 하기(10 초)를 계산 하고 100000 의 누적(5 초)을 계산 해 야 합 니 다.그러면 프로그램 이 병행 하 더 라 도 15 초,심지어 더 많이 사용 해 야 합 니 다.프로그램 이 CPU 를 사용 할 때 CPU 는 윤전 을 통 해 실행 되 기 때문에 IO 밀집 형 프로그램 은 IO 와 동시에 CPU 로 계산 할 수 있 지만 이곳 의 CPU 밀집 형 은 잠시 스 레 드 1 을 실행 하고 잠시 스 레 드 2 를 실행 할 수 밖 에 없다.그래서 15 초,심지어 더 필요 합 니 다.CPU 가 전환 할 때 시간 이 걸 리 기 때 문 입 니 다.CPU 밀집 형 프로그램의 다 중 스 레 드 문 제 를 해결 하 는 것 은 바로 CPU 의 일 입 니 다.예 를 들 어 Intel 의 초 스 레 드 기술 은 같은 핵심 에서 두 개의 스 레 드 를 진정 으로 병행 할 수 있 기 때문에'쌍 핵 4 스 레 드'또는'4 핵 8 스 레 드'라 고 부 릅 니 다.여기 서 구체 적 인 것 은 말 하지 않 고 저도 잘 모 르 겠 습 니 다.
파 이 썬 거짓말
이렇게 많은 스 레 드 의 장점 을 말 했 지만 사실 Python 은 진정한 의미 의 다 중 스 레 드 프로 그래 밍 을 지원 하지 않 습 니 다.Python 에 GIL 이라는 것 이 있 습 니 다.중국 어 는 전역 해석 기 입 니 다.이것 은 Python 을 제어 하여 Python 이 하나의 스 레 드 만 동시에 실행 할 수 있 도록 합 니 다.진정한 의미 의 다 중 스 레 드 는 CPU 가 제어 하고 Python 의 다 중 스 레 드 는 GIL 이 제어 하 는 셈 이다.CPU 집약 형 프로그램 이 있 으 면 C 언어 로 쓰 여 있 고 쿼 드 프로세서 에서 실행 되 며 다 중 스 레 드 기술 을 사용 하면 최대 4 배의 효율 성 을 얻 을 수 있 지만 Python 으로 쓰 면 향상 되 지 않 고 느 려 질 수 있 습 니 다.스 레 드 전환 문제 때 문 입 니 다.그래서 Python 다 중 스 레 드 는 I/O 밀집 형 프로그램 을 쓰기 에 상대 적 으로 적합 하고 효율 에 대한 요구 가 높 은 CPU 밀집 형 프로그램 은 모두 C/C++로 갔다.
첫 번 째 다 중 스 레 드
Python 의 다 중 스 레 드 라 이브 러 리 는 보통 thread 와 threading 두 개 를 사용 합 니 다.thread 는 초보 자 와 일반인 이 사용 하 는 것 을 추천 하지 않 습 니 다.threading 모듈 은 충분히 사용 할 수 있 습 니 다.
다음 과 같은 절차 가 있 습 니 다.두 순환 으로 각각 3 초 와 5 초 간 휴면 하고 직렬 로 실행 하려 면 8 초가 걸린다.

#!/usr/bin/env python
# coding=utf-8
import time
def sleep_3():
 time.sleep(3)
def sleep_5():
 time.sleep(5)
if __name__ == '__main__':
 start_time = time.time()
 print 'start sleep 3'
 sleep_3()
 print 'start sleep 5'
 sleep_5()
 end_time = time.time()
 print str(end_time - start_time) + ' s'
출력 은 이 렇 습 니 다.

start sleep 3
start sleep 5
8.00100016594 s
그런 후에 우 리 는 그것 을 다 중 스 레 드 프로그램 으로 바 꾸 었 다.비록 몇 줄 은 바 뀌 지 않 았 지만.먼저 threading 의 라 이브 러 리 를 도입 한 다음 에 하나의threading.Thread 대상 을 실례 화하 여 하나의 함 수 를 구조 방법 에 전달 하면 된다.그리고 Thread 의 start 방법 으로 스 레 드 를 시작 합 니 다.join() 방법 은 이 스 레 드 가 끝 날 때 까지 기다 릴 수 있 습 니 다.제 가 아래 에 사용 한 것 처럼 스 레 드 가 끝 날 때 까지 기다 리 는 코드 두 개 를 추가 하지 않 으 면 출력 시간의 문 구 를 직접 실행 합 니 다.그러면 통계 시간 이 맞지 않 습 니 다.

#!/usr/bin/env python
# coding=utf-8
import time
import threading #   threading
def sleep_3():
 time.sleep(3)
def sleep_5():
 time.sleep(5)
if __name__ == '__main__':
 start_time = time.time()
 print 'start sleep 3'
 thread_1 = threading.Thread(target=sleep_3)  #          ,         
 thread_1.start()  #       
 print 'start sleep 5'
 thread_2 = threading.Thread(target=sleep_5)  #          ,         
 thread_2.start()  #       
 thread_1.join()  #   thread_1  
 thread_2.join()  #   thread_2  
 end_time = time.time()
 print str(end_time - start_time) + ' s'
집행 결 과 는 이 렇 습 니 다.

start sleep 3
start sleep 5
5.00099992752 s
데 몬 데 몬 스 레 드
우리 가 이해 하 는 데 있어 서 데 몬 스 레 드 는 리 눅 스 의 데 몬 과 유사 하 게 매우 중요 할 것 입 니 다.하지만threading.Thread에 서 는 하필 아니 었 다.
하나의 스 레 드 를 수호 스 레 드 로 설정 하면 이 스 레 드 는 중요 하지 않 습 니 다.프로 세 스 가 종료 되 었 을 때 이 스 레 드 가 실 행 될 때 까지 기다 릴 필요 가 없습니다.파 이 썬 핵심 프로 그래 밍 제3 판
Thread 대상 에서 기본 적 인 모든 스 레 드 는 비 수호 스 레 드 입 니 다.여기 에는 두 가지 예 가 있 습 니 다.이 코드 를 실행 할 때 my 를 지정 하지 않 았 습 니 다.thread 의 daemon 속성 이 므 로 기본적으로 비 수호 이기 때문에 프로 세 스 가 끝 날 때 까지 기 다 립 니 다.마지막 으로 hello,World 100 개 를 볼 수 있 습 니 다.

#!/usr/bin/env python
# coding=utf-8
import threading
def hello_world():
 for i in range(100):
  print 'hello,world'
if __name__ == '__main__':
 my_thread = threading.Thread(target=hello_world)
 my_thread.start()
여기에 마 이 가 설치 되 어 있 습 니 다.thread 는 스 레 드 를 지 키 기 위해 프로 세 스 가 바로 종료 되 었 습 니 다.그의 끝 을 기다 리 지 않 았 기 때문에 우 리 는 100 개의 hello 를 볼 수 없습니다.World 는 몇 개 밖 에 없습니다.심지어 이상 을 던 져 서 스 레 드 가 끝나 지 않 았 다 고 알려 주기 도 한다.

#!/usr/bin/env python
# coding=utf-8
import threading
def hello_world():
 for i in range(100):
  print 'hello,world'
if __name__ == '__main__':
 my_thread = threading.Thread(target=hello_world)
 my_thread.daemon = True #       True
 my_thread.start()
매개 변수 전달
이전의 코드 는 모두 코드 를 직접 실행 하고 매개 변수의 전달 이 없 었 다.그러면 어떻게 매개 변 수 를 전달 합 니까?사실 아주 간단 해 요.4567914)면 됩 니 다.args 뒤에 있 는 것 은 원 그룹 입 니 다.매개 변수 가 없 으 면 쓰 지 않 아 도 됩 니 다.매개 변수 가 있 으 면 원 그룹 에 순서대로 추가 하면 됩 니 다.

#!/usr/bin/env python
# coding=utf-8
import threading
def hello_world(str_1, str_2):
 for i in range(10):
  print str_1 + str_2
if __name__ == '__main__':
 my_thread = threading.Thread(target=hello_world, args=('hello,', 'world')) #       
 my_thread.start()
다 중 스 레 드 추가
threading 은 세 가지 Thread 대상 을 만 드 는 방식 이 있 지만 보통 두 가지 만 사용 합 니 다.하 나 는 위의 0x 02 에서 말 한 전달 함수 입 니 다.다른 하 나 는 바로 여기 서 말 하 는 계승threading.Thread(target=hello_world, args=('hello,', 'world'))입 니 다.여기 서 우 리 는 두 가지 유형 을 정 의 했 습 니 다.유형 에서threading.Thread방법 을 다시 썼 습 니 다.즉,호출 run() 한 후에 실 행 된 코드 입 니 다.스 레 드 를 켜 면 이전 과 같 습 니 다.이전 방식 은 과정 을 향 해,이것 은 대상 을 향 해.

#!/usr/bin/env python
# coding=utf-8
import threading
class MyThreadHello(threading.Thread):
 def run(self):
  for i in range(100):
   print 'hello'
class MyThreadWorld(threading.Thread):
 def run(self):
  for i in range(100):
   print 'world'
if __name__ == '__main__':
 thread_hello = MyThreadHello()
 thread_world = MyThreadWorld()
 thread_hello.start()
 thread_world.start()
총결산
이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 면 댓 글 을 남 겨 주 십시오.

좋은 웹페이지 즐겨찾기