以同步方式实现长异步操作

时间:2011-11-08 18:57:39

标签: python asynchronous

我需要实现涉及长异步操作的函数(向外部服务器发送请求并定期检查是否已完成),这需要像同步操作一样。我是这样做的:

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

我想知道这是否可以接受,是否有更好的解决方案?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

你真的更喜欢远离投票。同步操作将更好地扩展并且更容易调试。如果您可以控制外部协议,则使其同步。我之所以这么说,主要是因为我觉得很多人都会把事情做成异步,以某种方式提高性能,因为它真的让事情变得更加困难。

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