>  기사  >  백엔드 개발  >  Python 조건 개체의 생산자 및 소비자 작업에 대한 코드 예제

Python 조건 개체의 생산자 및 소비자 작업에 대한 코드 예제

Y2J
Y2J원래의
2017-05-04 11:19:091728검색

이 글에서는 Python 조건변수의 생산자와 소비자 연산을 주로 소개하고, Python 조건변수의 개념, 원리, 스레드 연산 관련 기술을 구체적인 예시 형태로 분석해 도움이 필요한 친구들이 참고할 수 있도록 했습니다.

이 문서의 예에서는 Python 조건 변수의 생산자와 소비자 작업을 설명합니다. 참고를 위해 모든 사람과 공유하세요. 세부 사항은 다음과 같습니다:

뮤텍스 잠금은 가장 간단한 스레드 동기화 메커니즘입니다. 복잡한 스레드 동기화 문제에 직면하기 위해 Python은 Condition 개체 도 제공합니다. 조건은 잠금과 유사한 획득 및 해제 방법 외에도 대기 및 알림 방법도 제공합니다. 스레드는 먼저 조건 변수를 획득한 다음 일부 조건을 결정합니다. 조건이 충족되지 않으면 대기하고, 조건이 충족되면 일부 처리를 수행하여 조건을 변경하고, 대기 상태에 있는 다른 스레드가 조건을 다시 판단합니다. 알림을 받은 후. 이 프로세스는 복잡한 동기화 문제를 해결하기 위해 지속적으로 반복됩니다.

Condition 객체는 잠금(Lock/RLock)과 대기 풀을 유지한다고 생각하면 됩니다. 스레드는 acquire를 통해 Condition 개체를 얻습니다. wait 메서드가 호출되면 스레드는 Condition 내부의 잠금을 해제하고 차단된 상태로 들어가고(실제로 현재 스레드를 차단하지는 않음) 이 스레드를 대기 풀에 기록합니다. 알림 메서드가 호출되면 Condition 개체는 대기 풀에서 스레드를 선택하고 잠금 획득을 시도하기 위해 획득 메서드를 호출하도록 알립니다.

Condition 개체의 생성자 는 Lock/RLock 개체를 매개 변수로 허용할 수 있습니다. 지정하지 않으면 Condition 개체가 내부적으로 RLock을 생성합니다.

스레드 동기화의 고전적인 문제인 생산자와 소비자 문제는 조건 변수를 사용하여 쉽게 해결할 수 있습니다.

import threading
import time
class Producer(threading.Thread):
  def init(self):
    threading.Thread.init(self)
  def run(self):
    global count
    while True:
      con.acquire()
      if count <20:
        count += 1
        print self.name," Producer product 1,current is %d" %(count)
        con.notify()
      else:
        print self.name,"Producer say box is full"
        con.wait()
      con.release()
      time.sleep(1)
class Consumer(threading.Thread):
  def init(self):
    threading.Thread.init(self)
  def run(self):
    global count
    while True:
      con.acquire()
      if count>4:
        count -=4
        print self.name,"Consumer consume 4,current is %d" %(count)
        con.notify()
      else:
        con.wait()
        print self.name," Consumer say box is empty"
      con.release()
      time.sleep(1)
count = 0
con = threading.Condition()
def test():
  for i in range(1):
    a = Consumer()
    a.start()
  for i in range(1):
    b =Producer()
    b.start()
if name==&#39;main&#39;:
  test()

위 코드는 소비자가 빠르게 소비한다고 가정하고 출력 결과는 다음과 같습니다.

위 내용은 Python 조건 개체의 생산자 및 소비자 작업에 대한 코드 예제의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.