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) 를 대표 합 니 다.
주의해 야 할 두 가지 가 있다.
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 () 을 소 개 했 습 니 다. 그 밖 에:
다음 대상 은 다 중 스 레 드 동기 화 를 처리 하 는 데 사 용 됩 니 다.대상 이 만들어 지면 여러 스 레 드 에 의 해 공유 되 고 상황 에 따라 일부 프로 세 스 를 막 을 수 있 습 니 다.Linux 다 중 스 레 드 와 동기 화 의 동기 화 도구 와 참조 하여 읽 으 십시오.
threading. Lock 대상: mutex, acquire () 와 release () 방법 이 있 습 니 다.
threading. Condition 대상: condition variable, 이 대상 을 만 들 때 Lock 대상 을 포함 합 니 다 (condition variable 은 항상 mutex 와 함께 사용 하기 때 문 입 니 다).Condition 대상 에 게 acquire () 와 release () 방법 을 호출 하여 잠재 적 인 Lock 대상 을 제어 할 수 있 습 니 다.그 밖 에:
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
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Reading and Writing CSV Files in C#A much simpler way to have your application share data is by reading and writing Comma-Separated Values (CSV) files. CSV...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.