Python 다 중 스 레 드 의 인 스 턴 스 상세 설명
1)스 레 드 기반
1.스 레 드 생 성:
thread 모듈 은 start 를 제공 합 니 다.new_thread 함수,스 레 드 를 만 드 는 데 사용 합 니 다.start_new_thread 함수 가 성공 적 으로 생 성 된 후에 도 조작 할 수 있 습 니 다.
함수 원형:
start_new_thread(function,atgs[,kwargs])
그 매개 변 수 는 다음 과 같다.function:스 레 드 에서 실 행 된 함수 이름
args:모듈 형식의 매개 변수 목록 입 니 다.
kwargs:선택 가능 한 매개 변수,사전 형식 으로 매개 변 수 를 지정 합 니 다.
방법 1:thread 모듈 의 함 수 를 사용 하여 새 스 레 드 를 만 듭 니 다.
>>> import thread
>>> def run(n):
for i in range(n):
print i
>>> thread.start_new_thread(run,(4,)) #
53840
1
>>>
2
3
KeyboardInterrupt
>>> thread.start_new_thread(run,(2,))
17840
1
>>>
thread.start_new_thread(run,(),{'n':4})
39720
1
>>>
2
3
thread.start_new_thread(run,(),{'n':3})
32480
1
>>>
2
방법 2:threading.Thread 를 계승 하여 스 레 드 를 만 듭 니 다.
>>> import threading
>>> class mythread(threading.Thread):
def __init__(self,num):
threading.Thread.__init__(self)
self.num = num
def run(self): # run
print 'I am', self.num
>>> t1 = mythread(1)
>>> t2 = mythread(2)
>>> t3 = mythread(3)
>>> t1.start() # t1
I am
>>> 1
t2.start()
I am
>>> 2
t3.start()
I am
>>> 3
방법 3:threading.Thread 를 사용 하여 스 레 드 에서 함 수 를 직접 실행 합 니 다.
import threading
>>> def run(x,y):
for i in range(x,y):
print i
>>> t1 = threading.Thread(target=run,args=(15,20)) # Thread args
>>> t1.start()
15
>>>
16
17
18
19
2)Thread 대상 에서 자주 사용 하 는 방법:1.isAlive 방법:
>>> import threading
>>> import time
>>> class mythread(threading.Thread):
def __init__(self,id):
threading.Thread.__init__(self)
self.id = id
def run(self):
time.sleep(5) # 5
print self.id
>>> t = mythread(1)
>>> def func():
t.start()
print t.isAlive() #
>>> func()
True
>>> 1
2.join 방법:원형:join([timeout])
timeout:선택 가능 한 매개 변수,스 레 드 가 가장 오래 실 행 됩 니 다.
import threading
>>> import time # time
>>> class Mythread(threading.Thread):
def __init__(self,id):
threading.Thread.__init__(self)
self.id = id
def run(self):
x = 0
time.sleep(20)
print self.id
>>> def func():
t.start()
for i in range(5):
print i
>>> t = Mythread(2)
>>> func()
0
1
2
3
4
>>> 2
def func():
t.start()
t.join()
for i in range(5):
print i
>>> t = Mythread(3)
>>> func()
3
0
1
2
3
4
>>>
3.스 레 드 이름:
>>> import threading
>>> class mythread(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name=threadname)
def run(self):
print self.getName()
>>>
>>> t1 = mythread('t1')
>>> t1.start()
t1
>>>
4.setDaemon 방법스 크 립 트 가 실행 되 는 과정 에서 메 인 스 레 드 가 있 습 니 다.메 인 스 레 드 가 또 하나의 키 스 레 드 를 만 들 었 다 면 메 인 스 레 드 가 종료 되 었 을 때 하위 스 레 드 가 완성 되 었 는 지 확인 합 니 다.하위 스 레 드 가 완료 되 지 않 으 면 메 인 스 레 드 는 하위 스 레 드 가 완 료 된 후에 종 료 됩 니 다.
주 스 레 드 가 종료 되 어야 할 때,하위 스 레 드 가 완료 되 었 는 지 여 부 는 주 스 레 드 에 따라 종료 되 지 않 으 면,Thread 대상 의 setDaemon 방법 으로 설정 할 수 있 습 니 다.
3)스 레 드 동기 화
1.간단 한 스 레 드 동기 화
Thread 대상 의 Lock 과 RLock 을 사용 하면 간단 한 스 레 드 동기 화 를 실현 할 수 있 습 니 다.매번 하나의 스 레 드 만 조작 할 수 있 는 데이터 가 필요 하 다 면 조작 과정 을 acquire 방법 과 release 방법 사이 에 놓 을 수 있 습 니 다.예:
# -*- coding:utf-8 -*-
import threading
import time
class mythread(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name = threadname)
def run(self):
global x #
# lock.acquire() # lock acquire
for i in range(3):
x = x + 1
time.sleep(2)
print x
# lock.release() # lock release
#lock = threading.RLock() # Rlock
t1 = []
for i in range(10):
t = mythread(str(i))
t1.append(t)
x = 0 # 0
for i in t1:
i.start()
E:/study/<a href="http://lib.csdn.net/base/python" rel="external nofollow" class='replace_word' title="Python " target='_blank' style='color:#df3434; font-weight:bold;'>Python</a>/workspace>xianchengtongbu.py
3
6
9
12
15
18
21
24
27
30
lock.acquire()와 lock.release(),lock=threading.Lock()을 삭제 하고 실행 스 크 립 트 를 저장 하면 결 과 는 30 개 를 출력 합 니 다.30 은 x 의 최종 값 입 니 다.x 는 전체 변수 이기 때문에 모든 스 레 드 가 작 동 한 후에 휴면 상태 에 들 어 갑 니 다.스 레 드 가 휴면 할 때 Python 해석 기 는 다른 스 레 드 가 아니 라 x 의 값 이 증가 합 니 다.모든 스 레 드 휴면 이 끝 난 후에 x 의 값 은 모든 선 에서 30 으로 수정 되 었 기 때문에 출력 은 모두 30 입 니 다. 2.조건 변 수 를 사용 하여 스 레 드 동기 화 를 유지 합 니 다.
python 의 Condition 대상 은 복사 스 레 드 동기 화 지원 을 제공 합 니 다.Condition 대상 을 사용 하면 어떤 이벤트 가 실 행 된 후에 야 데 이 터 를 처리 할 수 있 습 니 다.Condition 대상 은 acquire 방법 과 release 방법 외 에 wait 방법,notify 방법,notify All 방법 등 을 조건 으로 처리 합 니 다.
# -*- coding:utf-8 -*-
import threading
class Producer(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name = threadname)
def run(self):
global x
con.acquire()
if x == 1000000:
con.wait()
# pass
else:
for i in range(1000000):
x = x + 1
con.notify()
print x
con.release()
class Consumer(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name = threadname)
def run(self):
global x
con.acquire()
if x == 0:
con.wait()
#pass
else:
for i in range(1000000):
x = x - 1
con.notify()
print x
con.release()
con = threading.Condition()
x = 0
p = Producer('Producer')
c = Consumer('Consumer')
p.start()
c.start()
p.join()
c.join()
print x
E:/study/python/workspace>xianchengtongbu2.py
1000000
0
0
스 레 드 간 통신:이벤트 대상 은 스 레 드 간 의 상호 통신 에 사 용 됩 니 다.그 는 스 레 드 간 통신 을 실현 하기 위해 신 호 를 설정 하고,매크로 를 제거 하고,기다 리 는 등 을 제공 했다.
1.신호 설정.이벤트 대상 이 set()방법 을 사용 한 후,isset()방법 은 진실 을 되 돌려 줍 니 다.
2.신 호 를 지 웁 니 다.이벤트 대상 의 clear()방법 을 사용 하면 isSet()방법 이 가짜 로 되 돌아 갑 니 다.
3.기다린다.이벤트 대상 의 내부 신호 가 가짜 일 때 wait()방법 은 실제 일 때 까지 기 다 렸 다가 돌아 갑 니 다.wait 에 파 라 메 터 를 전달 하여 가장 긴 대기 시간 을 설정 할 수 있 습 니 다.
# -*- coding:utf-8 -*-
import threading
class mythread(threading.Thread):
def __init__(self,threadname):
threading.Thread.__init__(self,name = threadname)
def run(self):
global event
if event.isSet():
event.clear()
event.wait() # event
print self.getName()
else:
print self.getName()
event.set()
event = threading.Event()
event.set()
t1 = []
for i in range(10):
t = mythread(str(i))
t1.append(t)
for i in t1:
i.start()
궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Python의 None과 NULL의 차이점 상세 정보그래서 대상 = 속성 + 방법 (사실 방법도 하나의 속성, 데이터 속성과 구별되는 호출 가능한 속성 같은 속성과 방법을 가진 대상을 클래스, 즉 Classl로 분류할 수 있다.클래스는 하나의 청사진과 같아서 하나의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.