如何为API提供“回调”?
我在阅读一些模块文档时,看到了一些我不太明白的内容,特别是在一个方法的参数解释中:
callback
- 这是一个回调函数,当计算完成后,会用一个参数列表来调用它,这个列表的内容是callbackargs+(result,)
。
callbackargs
- 这是给回调函数的额外参数。
group - 这是一个作业组,当你调用wait(group)
时,用来等待这个组里的作业完成。
我该如何调用这个方法,并正确地提供这些参数呢?它们的用途是什么,这个“回调”机制又是怎么运作的呢?
5 个回答
看这个链接,感觉就像是一个被调用的钩子。
回调 - 这是一个回调函数,它会在计算完成后被调用,传入的参数是
callbackargs+(result,)
。
这里的“计算完成后”听起来有点模糊。根据我的理解,这个东西的重点在于 submit()
调用会把工作分配给其他服务器,然后就返回了。因为这个完成过程是异步的,也就是说它不会阻塞主程序,这样你就可以提供一个函数,当某个工作单元完成时会被调用。如果你这样做:
submit( ..., callback=work_finished, ... )
那么 submit
会确保在目标服务器上分配的工作完成时调用 work_finished()
。
当你调用 submit()
时,可以提供一个回调,这个回调会在和调用 submit()
的同一个运行环境中被调用...而且是在工作负载函数分配完成后调用的。
有点像“在 submit()
中做完一些事情后调用 foo(x,y)
”。
不过,确实,文档可以写得更好。你可以看看 Python 的源代码,看看在 submit()
中回调是在哪个时刻被调用的。
如果你想要一些代码在结果准备好后立即执行,就把这些代码放进一个函数里,然后把这个函数作为 callback
参数传递进去。比如说,假设这个函数不需要其他参数:
def itsdone(result):
print(f"Done! result={result}")
...
submit(..., callback=itsdone)
想了解更多关于这个在Python中是怎么运作的,可以看看我关于这个主题的演示。
回调函数就是一个由使用API的人提供的函数,API可以在合适的时候调用这个函数,也就是“回叫”你。比如说,我预约了医生的看诊,我可以给他们我的电话号码,这样他们就可以在前一天打电话确认我的预约。回调函数就像这个,只不过它不仅仅是个电话号码,而是可以是一些具体的指令,比如“给我发一封邮件到这个地址,另外打电话给我的秘书,让她把这个安排到我的日历里。”
回调函数通常用在一些需要异步处理的场景中。如果你需要调用一个函数,然后立刻继续做其他事情,你就不能一直等着这个函数返回结果来告诉你发生了什么,这时候就需要提供一个回调函数。当这个函数完成它的异步工作后,它会调用你提供的回调函数,并传递一些预先设定的参数(通常有些是你提供的,还有一些是关于你请求的异步操作的状态和结果)。
比如说,如果医生不在办公室,或者他们还在安排日程,而不是让我一直等着,可能要等几个小时,我们就挂了电话。一旦预约安排好了,他们就会打电话给我。
在这个具体的例子中,文档中提到的方法会计算出一个 result
,把它和任何指定的 callbackargs
组合在一起,然后调用 callback
,把这些值作为参数传递给它。