순서대로 인쇄

3267 단어
도전
클래스가 있다고 가정합니다.

public class Foo {
  public void first() { print("first"); }
  public void second() { print("second"); }
  public void third() { print("third"); }
}


동일한 Foo 인스턴스가 세 개의 다른 스레드로 전달됩니다. 스레드 A는 first()를 호출하고, 스레드 B는 second()를 호출하고, 스레드 C는 third()를 호출합니다. first() 다음에 second()가 실행되고 second() 다음에 third()가 실행되도록 메커니즘을 설계하고 프로그램을 수정하십시오.

메모:

입력의 숫자가 순서를 암시하는 것처럼 보이지만 운영 체제에서 스레드가 어떻게 예약되는지 알 수 없습니다. 표시되는 입력 형식은 주로 테스트의 포괄성을 보장하기 위한 것입니다.

도전을 이해합시다

인스턴스와 스레드는 무엇입니까?
개체는 클래스의 인스턴스입니다. 아래 예에서 phone은 클래스이고 phone의 인스턴스는 phone_one입니다. 따라서 foo의 인스턴스를 생성하는 것은 객체를 생성하는 것과 같습니다.

class Phone:
    def __init__(self):
        self.brand = "samsung"
        self.model = "A50 
        self.color = "blue"

#object 
phone_one = Phone()


스레드는 서로 다른 시간 순서로 작동되는 일련의 작업입니다. 실행 순서 대신 다른 시간 순서로 다른 작업을 수행할 수 있습니다.
액션 1을 완료하기 위해 입력을 기다려야 한다고 가정해 보겠습니다. 액션 1을 기다리는 동안 다음 사용 가능한 액션인 액션 2로 이동할 수 있습니다.

import threading
import time

def eat(food):
    print("preparing to eat",food)
    time.sleep(1)
    print("back to eating ",food)

def movie(movie):
    print("watching", movie)
    print("Done watching")


x = threading.Thread(target=eat, args=("rice",))
x.start()

y = threading.Thread(target=movie, args=("spiderman",))
y.start()



출력으로 예상한 것

preparing to eat rice
back to eating  rice
watching spiderman
Done watching



실제 출력

preparing to eat rice
watching spiderman
Done watching
back to eating  rice


eat 함수를 실행하는 동안 흐름을 관찰하면 eat 함수가 최종 실행되기 전에 eat 함수에서 movie 함수로 빠져나가는데 이는 eat 함수에서 지연이 발생했기 때문입니다.

그래서 이 문제를 해결하기 위해 스레드가 제공하는 잠금 개체를 사용했습니다. 두 개 이상의 스레드가 액세스할 때 데이터의 공유 부분을 경쟁 조건이라고 합니다. 이번 챌린지의 경우입니다. foo의 동일한 인스턴스를 3개의 다른 스레드로 전달합니다.

경쟁 조건을 해결하기 위해 일반적인 방법은 스레드가 제공하는 Lock 개체를 사용하는 것입니다. 잠금은 다음 스레드가 실행되기 전에 잠금이 해제될 때까지 한 번에 하나의 스레드가 실행되도록 허용합니다.

import threading
from threading import Lock

class Number:
    def __init__(self):
        self.lock_one = threading.Lock()
        self.lock_two = threading.Lock()
        self.lock_one.acquire()
        self.lock_two.acquire()

    def first(self, num) -> None:
        print("one", num)
        self.lock_one.release()


    def second(self, num) -> None:
        self.lock_one.acquire()
        print("two", num)
        self.lock_two.release()


    def third(self,num) -> None:
        self.lock_two.acquire()
        print("three", num)

  #object      
num_instance = Number()

thread_a = threading.Thread(target=num_instance.third, args=(1,))
thread_a.start()

thread_b = threading.Thread(target=num_instance.second, args=(2,))
thread_b.start()

thread_c = threading.Thread(target=num_instance.first, args=(3,))
thread_c.start()



산출

one 3
two 2
three 1


보너스

좋은 웹페이지 즐겨찾기