我需要實現涉及長時間異步操作(向外部服務器發送請求並定期檢查是否完成)的函數,它需要表現得像同步操作一樣。我做了以下的方法:以同步方式實現長時間異步操作
start_long_operation()
while True:
if operation_finished():
return
sleep()
我不知道這是一個可以接受的,如果有更好的解決辦法?
我需要實現涉及長時間異步操作(向外部服務器發送請求並定期檢查是否完成)的函數,它需要表現得像同步操作一樣。我做了以下的方法:以同步方式實現長時間異步操作
start_long_operation()
while True:
if operation_finished():
return
sleep()
我不知道這是一個可以接受的,如果有更好的解決辦法?
根據異步操作的性質,有各種現有的解決方案可以讓您更優雅地做到這一點。例如,如果您正在等待服務器的響應,則可以在套接字上使用select以等待答覆。您也可以在多個套接字上同時執行此操作。
注意:應儘可能使用超時,以避免在發生某種錯誤時永久等待。您的帖子中提到的循環也會受到這種影響 - 您應該限制總時間或迭代次數。
你真的希望遠離投票。同步操作可以更好地擴展並且更易於調試。如果您能控制外部協議,請將其同步。我之所以這麼說,主要是因爲我認爲很多人會做異步思考,當它真的讓事情變得更加困難時,會以某種方式提高性能。
然後,您可以使用多個控制線程(線程,進程,基於選擇的FSM,無論什麼)使同步操作對您的本地事件循環顯示爲異步。如果您無法控制外部協議,並且它確實是異步的,那麼您別無選擇,只能進行輪詢。根據你認爲的響應時間的分佈情況,我會在投票期間使用某種指數回退和上限。對於大多數程序來說,我的主要事件循環都是外部的,並通過一些事件機制向我的事件循環回報。
不太明白爲什麼要用'while True:'用一個單獨的'if'而不是將條件放在'while'循環中,但除此之外,它看起來很好。 – kindall