순서대로 인쇄
클래스가 있다고 가정합니다.
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
보너스
Reference
이 문제에 관하여(순서대로 인쇄), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/michael2509/print-in-order-31do텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)