Python 다 중 스 레 드 동기 화 를 실현 하 는 네 가지 방식

임계 자원 은 한 번 에 한 스 레 드 에 만 접근 할 수 있 는 자원 입 니 다.전형 적 인 예 는 프린터 입 니 다.한 번 에 한 프로그램 에 의 해 인쇄 기능 을 수행 할 수 있 습 니 다.여러 스 레 드 가 동시에 작 동 할 수 없 기 때문에 이 부분 자원 에 접근 하 는 코드 를 임계 구역 이 라 고 합 니 다.
자물쇠 메커니즘
threading 의 Lock 클래스 는 이러한 acquire 함수 로 잠 금 을 추가 하고 realase 함수 로 잠 금 을 풀 수 있 습 니 다.

import threading
import time

class Num:
  def __init__(self):
    self.num = 0
    self.lock = threading.Lock()
  def add(self):
    self.lock.acquire()#  ,       
    self.num += 1
    num = self.num
    self.lock.release()#  ,     
    return num

n = Num()
class jdThread(threading.Thread):
  def __init__(self,item):
    threading.Thread.__init__(self)
    self.item = item
  def run(self):
    time.sleep(2)
    value = n.add()# num 1,         +1     
    print(self.item,value)

for item in range(5):
  t = jdThread(item)
  t.start()
  t.join()#         
스 레 드 가 자 물 쇠 를 호출 하 는 acquire()방법 으로 자 물 쇠 를 얻 었 을 때 자 물 쇠 는"locked"상태 로 들 어 갑 니 다.매번 한 라인 만 자 물 쇠 를 얻 을 수 있다.이 때 다른 스 레 드 가 이 자 물 쇠 를 가 져 오 려 고 하면 이 스 레 드 는'blocked'상태 로 바 뀌 어'동기 화 차단'이 라 고 합 니 다.(다 중 스 레 드 의 기본 개념 참조)
자 물 쇠 를 가 진 스 레 드 가 자 물 쇠 를 호출 하 는 release()방법 으로 자 물 쇠 를 풀 때 까지 자 물 쇠 는'unlocked'상태 로 들 어 갑 니 다.스 레 드 스케줄 러 는 동기 화 차단 상태 에 있 는 스 레 드 에서 하 나 를 선택 하여 자 물 쇠 를 얻 고 이 스 레 드 를 실행(running)상태 로 들 어가 게 합 니 다.
신호 량
신 호 량 도 acquire 방법 과 release 방법 을 제공 합 니 다.acquire 방법 을 호출 할 때마다 내부 카운터 가 0 보다 크 면 1 을 줄 이 고 내부 카운터 가 0 이면 이 스 레 드 를 막 습 니 다.스 레 드 가 release 방법 을 호출 하여 내부 계수 기 를 1 이상 으로 업데이트 하 는 것 을 알 고 있 습 니 다.

import threading
import time
class Num:
  def __init__(self):
    self.num = 0
    self.sem = threading.Semaphore(value = 3)
    #              

  def add(self):
    self.sem.acquire()#      1
    self.num += 1
    num = self.num
    self.sem.release()#      1
    return num

n = Num()
class jdThread(threading.Thread):
  def __init__(self,item):
    threading.Thread.__init__(self)
    self.item = item
  def run(self):
    time.sleep(2)
    value = n.add()
    print(self.item,value)

for item in range(100):
  t = jdThread(item)
  t.start()
  t.join()
조건 부 판단
이른바 조건 변수,즉 이런 메커니즘 은 특정한 조건 을 만족 시 킨 후에 야 라인 이 관련 데 이 터 를 방문 할 수 있다.
Condition 류 를 사용 하여 완성 합 니 다.잠 금 장치 처럼 사용 할 수 있 기 때문에 acquire 방법 과 release 방법 도 있 습 니 다.그리고 wait,notify,notify All 방법 도 있 습 니 다.

"""
            ,                ,           +1,           -1.
"""

"""
   Condition     ,             ,      acquire     release   ,     
wait, notify, notifyAll   。
"""

import threading
import queue,time,random

class Goods:#   
  def __init__(self):
    self.count = 0
  def add(self,num = 1):
    self.count += num
  def sub(self):
    if self.count>=0:
      self.count -= 1
  def empty(self):
    return self.count <= 0

class Producer(threading.Thread):#    
  def __init__(self,condition,goods,sleeptime = 1):#sleeptime=1
    threading.Thread.__init__(self)
    self.cond = condition
    self.goods = goods
    self.sleeptime = sleeptime
  def run(self):
    cond = self.cond
    goods = self.goods
    while True:
      cond.acquire()#    
      goods.add()
      print("    :",goods.count,"     ")
      cond.notifyAll()#         --》           
      cond.release()#    
      time.sleep(self.sleeptime)

class Consumer(threading.Thread):#    
  def __init__(self,condition,goods,sleeptime = 2):#sleeptime=2
    threading.Thread.__init__(self)
    self.cond = condition
    self.goods = goods
    self.sleeptime = sleeptime
  def run(self):
    cond = self.cond
    goods = self.goods
    while True:
      time.sleep(self.sleeptime)
      cond.acquire()#    
      while goods.empty():#          
        cond.wait()
      goods.sub()
      print("    :",goods.count,"     ")
      cond.release()#    

g = Goods()
c = threading.Condition()

pro = Producer(c,g)
pro.start()

con = Consumer(c,g)
con.start()

동기 화 대기 열
put 방법 과 taskdone 방법,quue 는 미 완성 퀘 스 트 수량 num,put 순서 num+1,task 순서 num-1.퀘 스 트 가 모두 완성 되 었 을 때 퀘 스 트 가 끝 납 니 다.

import threading
import queue
import time
import random

'''
1.     Queue.Queue()    ,            。
2.                ,        threading.Thread       。
3.            ,            run           。
4.         ,   queue.task_done()                   。
5.      join   ,            ,      。
'''

class jdThread(threading.Thread):
  def __init__(self,index,queue):
    threading.Thread.__init__(self)
    self.index = index
    self.queue = queue

  def run(self):
    while True:
      time.sleep(1)
      item = self.queue.get()
      if item is None:
        break
      print("  :",self.index,"  ",item,"  ")
      self.queue.task_done()#task_done            -1

q = queue.Queue(0)
'''
                    ,      
      0  ,                 .
'''
for i in range(2):
  jdThread(i,q).start()#          

for i in range(10):
  q.put(i)#put            +1

이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기