实施 Cancel 回调

UDx 可以实施 cancel() 回调函数。如果调用 UDx 的查询已被取消,Vertica 将调用此函数。

通常可以实施此函数以对 UDx 已生成的任何附加处理执行有序关闭。例如,您可以让 cancel() 函数关闭 UDx 已生成的线程,或者也可以让该函数向第三方库指示它需要停止处理并退出。cancel() 函数应使 UDx 的函数类准备好进行销毁,因为 Vertica 会在 cancel() 函数已退出之后调用 UDx 的 destroy() 函数。

UDx 的默认 cancel() 行为是什么都不做。

cancel() 的合约为:

  • 对于每个 UDx 实例,Vertica 最多会调用一次 cancel()

  • Vertica 可以与 UDx 对象的任何其他方法(构造函数和析构函数除外)同时调用 cancel()

  • Vertica 可以从另一个线程调用 cancel(),因此实施应当是线程安全的。

  • Vertica 将调用 cancel() 来处理明确的用户取消或查询错误。

  • Vertica 不保证 cancel() 将运行完成。长期取消可能会被中止。

cancel() 的调用不会以任何方式与 UDx 的其他函数同步。如果要求处理函数在 cancel() 函数执行某项操作(例如终止线程)之前退出,您必须让这两个函数同步其操作。

如果调用 setup(),则 Vertica 始终调用 destroy()。取消并不能防止破坏。

有关实施 cancel() 的示例,请参阅 C++ 示例:可取消的 UDSource