2014-09-15 5 views
0

다음 기능은 RackSpace 서버가 구축 될 때까지 대기합니다. 그 후 서버 객체를 반환합니다 :파이썬 while 루프가 종료되지 않는 이유는 무엇입니까?

def _wait_for_server(cloud_server, server): 
    while server.status != 'ACTIVE': 
     sleep(30) 
     s = cloud_server.servers.get(server.id) 
     print '%s: %s (%s%%)' % (s.id, s.status, s.progress) 

    return server 

임대해야 할 일은 무엇입니까? 대신 서버 상태가 Active에 도달하면 while 루프가 계속 실행되고 종료되지 않습니다. 왜 이런 일이 일어나는 걸까요?

7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (10%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (10%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (10%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (10%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (40%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (40%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (40%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (40%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (70%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: BUILD (80%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: ACTIVE (100%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: ACTIVE (100%) 
7cbadf1b-1090-40d5-9437-9869ca392b5a: ACTIVE (100%) 
... runs until the end of time or my laptop battery runs out 
+4

당신은'server.status'를 검사하지만, while 루프 안에서's' ('server'가 아닙니다)를 업데이트하기 때문에. – dano

+0

댐 !!!!!!!!!!!!! 그런 학교 소년 오류! – Prometheus

+3

@Sputnik 당신은 [고무 오리] (http://blog.codinghorror.com/rubber-duck-problem-solving/)를 얻어야합니다! – jonrsharpe

답변

1

루프에서 변수 server가 업데이트되지 않습니다 :

다음은 위의 코드를 보여 터미널 출력됩니다.

def _wait_for_server(cloud_server, server): 
    while True: 
     sleep(30) 
     s = cloud_server.servers.get(server.id) 
     print '%s: %s (%s%%)' % (s.id, s.status, s.progress) 
     if s.status == 'ACTIVE': 
      break 

    return server 

또는 server 대신 s 업데이트 :

def _wait_for_server(cloud_server, server): 
    while server.status != 'ACTIVE': 
     sleep(30) 
     server = cloud_server.servers.get(server.id) 
     print '%s: %s (%s%%)' % (server.id, server.status, server.progress) 

    return server 
+2

그럴 경우 'while true'가 아닌가요? – jonrsharpe

+0

@jonrsharpe : 좋은 제안입니다! – Zulu

+0

둘 다 실제로 작동하지 않습니다. 첫 번째 서버는 업데이트되지 않고 두 번째 서버는 결코 업데이트되거나 정의되지 않은 요소를 인쇄하려고 시도하지 않습니다. – gkusner

1

나는 "s"를 의심하고 "서버"변수가 다른 값을 가질 루프에서 벗어나고을 위해 당신은 break 문을 추가해야합니다. 네트워크에서 s를 가져 오지만 서버로는 아무 것도하지 마십시오. 난 당신이 거기에

server = s 

를 넣으면 내기, 그것은 작업을 시작합니다.

관련 문제