Python 다 중 스 레 드 의 인 스 턴 스 상세 설명

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() 

궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기