파이썬 (35) 시리얼 교착 상태 문제와 해결 방법

첫째, 교착 상태

 

  1.  
가져 오기 스레딩 

가져 오기 시간 
lock_1

 = threading.Lock과 () 

lock_2 = threading.Lock과 () 


DEF Func을-1 () : 

    인쇄 ( " Func을-1 시작 ... " ) 

    lock_1.acquire () #은 내가 lock_1의에 선점 

    인쇄 ( " Func을-1은 ..... lock_1을 제기 " ) 

    time.sleep ( 2) #은 이 두 가지 기능이 교착 형성하도록, 아 기다릴 필요가 

    인쇄 ( " Func을-1 ...... lock_2 기다려 " ) 

    lock_2을. () 취득 

    인쇄 ( "func_1는 lock_2 적용 " ) 

    lock_2.release () 

    인쇄 ( " func_1 발표 lock_2 " ) 

    lock_1.release () 

    인쇄 ( " func_1 발표 lock_1 " ) 


    인쇄 ( " func_1 DONE " ) 


DEF : Func을-2 () 

    인쇄 ( " Func을-2 쳐다보고 ... " ) 

    lock_2.acquire는 () # 나는 lock_2의에 선점 

    인쇄 ( " Func을-2 ..... 제기 lock_2 " ) 

    time.sleep ( 4 ) 

    인쇄( " Func을-2 ....... lock_1 기다립니다 " ) 

    lock_1.acquire () 

    인쇄 ( " Func을-2 ..... 제기 lock_1 " ) 

    lock_1.release () 

    인쇄 ( " Func을-2 분리 lock_1 " ) 

    lock_2.release을 () 

    인쇄 ( " func_2 분리 lock_2 " ) 


    인쇄 ( " func_2 DONE " ) 


IF  __name__ == " __main__ " : 

    T1 = threading.Thread (목표 = func_1의인수 = ()) 

    T2= threading.Thread (목표 = func_2, 인수의 = ()) 
    t1.start () 
    t2.start () 
    t1.join () 
    t2.join ()





2. 솔루션

우리는 판단 문을 결합, 응용 프로그램은 갈 직접 적용되지 잠글 수 없습니다

RST = lock_4.acquire (제한 = -1)이 #이 리턴 값은 부울 변수임을 나타내고, 제한 시간 종료 대신 점프 내부 주목

 

= lock_3 threading.Lock과 ()의 

lock_4 = threading.Lock과의 () 


DEF의 func_3 () : 

    인쇄 ( " func_3 시작 ..... " ) 

    lock_3.acquire (제한 = -1 ) 

    인쇄 ( " func_3는 lock_3인가 .. ... " ) 

    time.sleep는 ( 2 ) 

    인쇄 ( " func_3가 ....... lock_4 대기 " ) 
    RST

 = lock_4.acquire을 (타임 아웃 = -1) #는 이 리턴 값임을 표시하는 부울 변수 타임 아웃 시간 제한이 대신 뛰어 

    IF RST : 

        인쇄 ( "잠금 lock_4와 func_3 " ) 

        lock_4.release () 

        인쇄 ( " func_3 발표 lock_4 " ) 

    그렇지 않으면 : 

        인쇄 ( " func_3이 lock_4 적용되지 " ) 
    lock_3.release () 



    인쇄 ( " func_3 발표 lock_3 " ) 


    인쇄 ( " func_3 DONE ... " ) 



DEF의 func_4 () : 

    인쇄 ( " func_4이 ..... 시작 " ) 

    lock_4.acquire을 (제한 시간 = 4 )

    인쇄 ( " func_4 ..... 제기 lock_4 " ) 

    time.sleep이 ( 2 ) 

    인쇄 ( " func_4 ....... lock_3 기다립니다 " ) 
    RST

 = lock_3.acquire (타임 아웃 = 2 ) 

    IF RST를 : 

        인쇄 ( " func_3는 잠금 lock_3 얻었다 " ) 

        lock_3.release () 

        인쇄 ( " func_4 발표 lock_3 " ) 

    그렇지 않으면 : 

        인쇄 ( " func_4이 lock_3 적용되지 " ) 
    lock_4.release () 



    인쇄 (" func_4释放了lock_4 " ) 


    인쇄 ( " func_4 ......가 완료 " ) 


경우  __name__ == " __main__ " : 
    T3

 = threading.Thread (목표 = func_3, 인수의 = ()) 

    T4 = 스레딩. 스레드 (목표 = func_4, 인수의 = ()) 
    t3.start () 
    t4.start () 
    t3.join () 
    t4.join ()







 

충돌을 해결하기 위해,하지만이 교착 상태를 해결하는 것은 아니지만,이 충분이이 문제를 방지한다

둘째, 소스

d25_3_dead_lock.py

https://github.com/ruigege66/Python_learning/blob/master/d25_3_dead_lock.py

2.CSDN : HTTPS : //blog.csdn.net/weixin_44630050 (사이 6월 6월 기분 모른다 - 루이를)

3. 공원 블로그 : HTTPS : //www.cnblogs.com/ruigege0000/

4. 마이크로 채널 공공 숫자에 초점을 환영합니다 : 푸리에 빅 데이터 학습 자료를 얻기 위해, 무대 응답 "선물"을 변환

 

 

추천

출처www.cnblogs.com/ruigege0000/p/11462696.html