2011-11-08 37 views
2

我需要实现涉及长时间异步操作(向外部服务器发送请求并定期检查是否完成)的函数,它需要表现得像同步操作一样。我做了以下的方法:以同步方式实现长时间异步操作

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

我不知道这是一个可以接受的,如果有更好的解决办法?

+2

不太明白为什么要用'while True:'用一个单独的'if'而不是将条件放在'while'循环中,但除此之外,它看起来很好。 – kindall

回答

2

根据异步操作的性质,有各种现有的解决方案可以让您更优雅地做到这一点。例如,如果您正在等待服务器的响应,则可以在套接字上使用select以等待答复。您也可以在多个套接字上同时执行此操作。

注意:应尽可能使用超时,以避免在发生某种错误时永久等待。您的帖子中提到的循环也会受到这种影响 - 您应该限制总时间或迭代次数。

2

你真的希望远离投票。同步操作可以更好地扩展并且更易于调试。如果您能控制外部协议,请将其同步。我之所以这么说,主要是因为我认为很多人会做异步思考,当它真的让事情变得更加困难时,会以某种方式提高性能。

然后,您可以使用多个控制线程(线程,进程,基于选择的FSM,无论什么)使同步操作对您的本地事件循环显示为异步。如果您无法控制外部协议,并且它确实是异步的,那么您别无选择,只能进行轮询。根据你认为的响应时间的分布情况,我会在投票期间使用某种指数回退和上限。对于大多数程序来说,我的主要事件循环都是外部的,并通过一些事件机制向我的事件循环回报。