Python 표준 라 이브 러 리 08 다 중 스 레 드 와 동기 화 (threading 패키지)

15064 단어 reading
원문:
Python 표준 라 이브 러 리 08 다 중 스 레 드 와 동기 화 (threading 패키지)
저자: Vamei 출처:http://www.cnblogs.com/vamei 전재 에 오신 것 을 환영 합 니 다. 이 성명 도 보류 하 세 요.감사합니다!
 
Python 은 주로 표준 라 이브 러 리 의 threading 패 키 지 를 통 해 다 중 스 레 드 를 실현 합 니 다.오늘날 인터넷 시대 에는 모든 서버 가 대량의 요청 을 받는다.서버 는 네트워크 포트 에 대한 읽 기와 쓰기 효율 을 높이 기 위해 다 중 스 레 드 방식 으로 이 요청 을 처리 할 수 있다.Python 은 네트워크 서버 의 배경 작업 언어 (예 를 들 어 콩짜개 그물) 이기 때문에 다 중 스 레 드 도 자 연 스 럽 게 Python 언어 에 의 해 지원 된다.
(다 중 스 레 드 의 원리 와 C 실현 방법 에 대해 제 가 전에 쓴 Linux 다 중 스 레 드 와 동기 화 을 참고 하여 race condition, mutex 와 condition variable 의 개념 을 알 아야 합 니 다)
 
다 중 스 레 드 티켓 팅 및 동기 화
우 리 는 파 이 썬 을 사용 하여 Linux 다 중 스 레 드 와 동기 화 문 중의 매 표 절 차 를 실현 한다.저 희 는 mutex (즉 Python 의 Lock 클래스 대상) 를 사용 하여 스 레 드 의 동기 화 를 실현 합 니 다.
# A program to simulate selling tickets in multi-thread way # Written by Vamei



import threading import time import os # This function could be any function to do other chores.

def doChore(): time.sleep(0.5) # Function for each thread

def booth(tid): global i global lock
while True: lock.acquire()               # Lock; or wait if other thread is holding the lock if i != 0: i = i - 1                 # Sell tickets
print(tid,':now left:',i) # Tickets left doChore()                # Other critical operations else: print("Thread_id",tid," No more tickets") os._exit(0) # Exit the whole process immediately lock.release()               # Unblock doChore()                    # Non-critical operations # Start of the main function i = 100 # Available ticket number lock = threading.Lock() # Lock (i.e., mutex) # Start 10 threads for k in range(10): new_thread = threading.Thread(target=booth,args=(k,))   # Set up thread; target: the callable (function) to be run, args: the argument for the callable new_thread.start()                         # run the thread

우 리 는 두 개의 전역 변 수 를 사 용 했 는데 하 나 는 i 로 나머지 표를 저장 했다.하 나 는 lock 대상 으로 동기 화 스 레 드 가 i 에 대한 수정 에 사 용 됩 니 다.그 밖 에 마지막 for 순환 에서 우 리 는 모두 10 개의 스 레 드 를 설정 했다.모든 스 레 드 는 booth () 함 수 를 실행 합 니 다.스 레 드 는 start () 방법 을 호출 할 때 정식으로 시작 합 니 다. (실제로 컴퓨터 에는 최대 11 개의 스 레 드 가 있 습 니 다. 메 인 프로그램 자체 도 하나의 스 레 드 를 차지 하기 때 문 입 니 다)Python 은 threading. Thread 대상 을 사용 하여 스 레 드 를 대표 하고 threading. Lock 대상 으로 상호 배척 자물쇠 (mutex) 를 대표 합 니 다.
주의해 야 할 두 가지 가 있다.
  • 우 리 는 함수 에서 global 을 사용 하여 변 수 를 전역 변수 로 설명 하여 다 중 스 레 드 가 i 와 lock 을 공유 하도록 합 니 다 (C 언어 에서 우 리 는 변 수 를 모든 함수 밖 에 두 어 전체 변수 로 만 듭 니 다).이렇게 밝 히 지 않 으 면 i 와 lock 은 가 변 데이터 대상 이기 때문에 국부 변수 로 간 주 됩 니 다 (Python 동적 형식 참조).가 변 데이터 대상 이 라면 글로벌 성명 이 필요 없다.우 리 는 심지어 가 변 데이터 대상 을 매개 변수 로 스 레 드 함수 에 전달 할 수 있다.이 스 레 드 들 은 가 변 데이터 대상 을 공유 할 것 이다.
  • 우 리 는 booth 에서 두 개의 doChore () 함 수 를 사용 했다.스 레 드 가 i = i - 1 을 제외 하고 더 많은 조작 을 할 수 있 도록 미래 에 프로그램 을 개선 할 수 있 습 니 다. 예 를 들 어 남 은 표 인쇄, 거스름돈, 물 한 모금 등 입 니 다.첫 번 째 doChore () 는 여전히 Lock 내부 에 있 기 때문에 공유 자원 (critical operations, 예 를 들 어 남 은 표 인쇄) 을 안전하게 사용 할 수 있 습 니 다.두 번 째 doChore () 때 Lock 이 풀 려 났 기 때문에 공유 자원 을 더 이상 사용 할 수 없습니다.이 럴 때 공유 자원 을 사용 하지 않 는 작업 (non - critical operation, 예 를 들 어 거스름돈, 물 마 시기) 을 할 수 있다.나 는 추가 적 인 조작 에 걸 릴 수 있 는 시간 을 대표 하기 위해 일부러 doChore () 를 0.5 초 기 다 렸 다.doChore () 대신 정의 할 수 있 는 함수 입 니 다.

  •  
    OOP 생 성 루틴
    위의 Python 프로그램 은 과정 을 향 한 C 프로그램 과 매우 유사 하 다.대상 (OOP, object - oriented programming, Python 대상 지향 기본 개념Python 대상 에 대한 추가 확장 참조) 을 대상 으로 다 중 스 레 드 를 실현 하 는 방법 을 소개 한다. 그 핵심 은 threading. Thread 류 를 계승 하 는 것 이다.위의 for 순환 에 서 는 threading. Thread () 방법 을 이용 하여 Thread 대상 을 만 들 고 함수 booth () 와 그 매개 변 수 를 변경 대상 에 게 전달 하 며 start () 방법 으로 스 레 드 를 실행 합 니 다.OOP 의 경우 Thread 류 의 run () 방법 을 수정 하여 스 레 드 가 실행 할 명령 을 정의 합 니 다.
    # A program to simulate selling tickets in multi-thread way # Written by Vamei
    
    
    
    import threading import time import os # This function could be any function to do other chores.
    
    def doChore(): time.sleep(0.5) # Function for each thread
    
    class BoothThread(threading.Thread): def __init__(self, tid, monitor): self.tid = tid self.monitor = monitor
            threading.Thread.__init__(self)
    def run(self): while True:  monitor['lock'].acquire()       # Lock; or wait if other thread is holding the lock     if monitor['tick'] != 0: monitor['tick'] = monitor['tick'] - 1 # Sell tickets
    print(self.tid,':now left:',monitor['tick']) # Tickets left doChore()                   # Other critical operations else: print("Thread_id",self.tid," No more tickets") os._exit(0)      # Exit the whole process immediately monitor['lock'].release()      # Unblock doChore()      # Non-critical operations # Start of the main function monitor = {'tick':100, 'lock':threading.Lock()} # Start 10 threads for k in range(10): new_thread = BoothThread(k, monitor) new_thread.start()

    우 리 는 thread. Threading 클래스 를 계승 하 는 BoothThread 클래스 를 스스로 정 의 했 습 니 다.그리고 우 리 는 위의 booth () 가 진행 하 는 조작 을 모두 BoothThread 류 의 run () 방법 에 넣 었 다.전역 변 수 를 사용 하여 global 을 설명 하지 않 고 사전. Monitor 를 사용 하여 전역 변 수 를 저장 한 다음 사전 을 매개 변수 로 스 레 드 함수 에 전달 합 니 다.사전 은 가 변 데이터 대상 이기 때문에 함수 에 전 달 될 때 함수 가 사용 하 는 것 은 여전히 같은 대상 이 고 여러 스 레 드 에 의 해 공유 되 는 것 과 같다.이것 도 다 중 스 레 드, 더 나 아가 다 중 프로 세 스 프로 그래 밍 기술 입 니 다.
    위의 OOP 프로 그래 밍 방법 은 프로 세 스 를 위 한 프로 그래 밍 방법 에 비해 큰 실질 적 인 차 이 를 가 져 오지 않 았 다.
     
    기타
    threading. Thread 대상: 이 대상 의 start () 와 run () 을 소 개 했 습 니 다. 그 밖 에:
  • join () 방법 으로 이 방법 을 호출 하 는 스 레 드 는 Thread 대상 이 완 료 될 때 까지 기 다 렸 다가 다시 실 행 됩 니 다.이것 은 프로 세 스 간 에 wait () 함 수 를 호출 하 는 것 과 유사 합 니 다.

  •  
    다음 대상 은 다 중 스 레 드 동기 화 를 처리 하 는 데 사 용 됩 니 다.대상 이 만들어 지면 여러 스 레 드 에 의 해 공유 되 고 상황 에 따라 일부 프로 세 스 를 막 을 수 있 습 니 다.Linux 다 중 스 레 드 와 동기 화 의 동기 화 도구 와 참조 하여 읽 으 십시오.
    threading. Lock 대상: mutex, acquire () 와 release () 방법 이 있 습 니 다.
    threading. Condition 대상: condition variable, 이 대상 을 만 들 때 Lock 대상 을 포함 합 니 다 (condition variable 은 항상 mutex 와 함께 사용 하기 때 문 입 니 다).Condition 대상 에 게 acquire () 와 release () 방법 을 호출 하여 잠재 적 인 Lock 대상 을 제어 할 수 있 습 니 다.그 밖 에:
  • wait () 방법, condwait()
  • notify_all (), 상당히 condbroadcast()
  • nofify (), notifyall () 기능 은 유사 하지만 기다 리 는 스 레 드 만 깨 우 는 것 이지 모든
  • 이 아 닙 니 다.
    threading. semaphore 대상: semaphore, 즉 계수 자물쇠 (semaphore 전통 적 인 의미 에서 프로 세 스 간 동기 화 도구 로 Linux 프로 세 스 간 통신 참조).대상 을 만 들 때 하나의 정 수 를 계수 상한 선 (sema = threading. semaphore (5) 으로 전달 할 수 있 습 니 다.그것 은 Lock 과 유사 하고 Lock 의 두 가지 방법 도 있다.
    threading. Event 대상: threading. Condition 과 유사 하여 잠재 적 인 Lock 보호 가 없 는 condition variable 에 해당 합 니 다.대상 은 트 루 와 False 두 가지 상태 다.한 스 레 드 가 대상 의 set () 방법 을 호출 할 때 까지 wait () 를 여러 스 레 드 로 기다 릴 수 있 습 니 다. 대상 을 True 로 설정 합 니 다.스 레 드 는 대상 의 clear () 방법 을 호출 하여 대상 을 False 상태 로 초기 화 할 수 있 습 니 다.
     
     
    연습 하 다.
    참조 하 다.
    Linux 다 중 스 레 드 와 동기 화 의 condition variable 의 예 는 Python 을 사용 하여 이 루어 집 니 다.프로 세 스 와 대상 을 위 한 프로 그래 밍 방법 도 고려 합 니 다.
    더 많은 threading 내용 은 참고 하 시기 바 랍 니 다:
    http://docs.python.org/library/threading.html
     
    총결산
    threading.Thread
    Lock, Condition, Semaphore, Event

    좋은 웹페이지 즐겨찾기