2011-11-08 6 views
2

긴 비동기 작업 (외부 서버에 요청을 보내고 작업이 완료되었는지 주기적으로 확인)이 포함 된 기능을 구현하여 동기 작업과 같이 동작해야합니다. 나는 다음과 같은 방식으로 그렇게하고있다 :동기식으로 긴 비동기 작업 구현

start_long_operation() 
while True: 
    if operation_finished(): 
    return 
    sleep() 

더 좋은 해결책이 있을까요?

+2

'while while'조건을 'while'루프에 넣는 대신에 별도의'if '를 사용하여 왜 while while : while을 사용하는지 이해하지는 못 하겠지만 그 외의 경우에는 괜찮습니다. – kindall

답변

2

비동기 작업의 성격에 따라 더 우아하게이 작업을 수행 할 수있는 다양한 기존 솔루션이 있습니다. 예를 들어, 서버로부터의 응답을 기다리는 경우 소켓의 select을 사용하여 응답을 기다릴 수 있습니다. 한 번에 여러 소켓에서이 작업을 수행 할 수도 있습니다.

참고 : 오류 발생시 영원히 기다리지 않으려면 항상 가능한 한 시간 초과를 사용해야합니다. 게시물에 언급 된 루프도 이와 관련이 있습니다. 총 시간 또는 반복 횟수를 제한해야합니다.

2

폴링을 멀리하는 것이 좋습니다. 동기 연산은 확장 성이 좋고 디버그하기가 쉽습니다. 외부 프로토콜을 제어 할 수 있다면 동기화하십시오. 많은 사람들이 일을 더 어렵게 만들 때 어떻게 든 성능을 향상시키는 비동기 적 사고를 만들 것이라고 생각하기 때문에이 말을 주로합니다.

그런 다음 여러 제어 스레드 (스레드, 프로세스, 선택 기반 FSM 등)를 사용하여 동기화 작업을 로컬 이벤트 루프와 비동기로 표시 할 수 있습니다. 외부 프로토콜을 제어 할 수없고 실제로 비동기이면 폴링 할 수밖에 없습니다. 당신이 응답 시간의 분포를 어떻게 생각 하느냐에 따라 나는 투표 기간에 대한 한도를 가진 일종의 기하 급수적 인 백 오프를 사용할 것입니다. 대부분의 프로그램에서 나는 메인 이벤트 루프의 외부에 있고 이벤트 루프를 통해 어떤 이벤트 메커니즘을 통해 다시보고해야한다.

관련 문제