我有一个功能可以进行相当多的密集处理。有时我需要能够停止它(即用于数据库维护),即使它处于运行中期。我想给它发送一个 SIGINT,这样它就可以优雅地结束它正在做的事情。我发现,只要我引入一个普通的 perl 中断处理程序,该函数就会停止正确响应中断。
在职的
CREATE OR REPLACE FUNCTION run_for_awhile() RETURNS void
AS $_X$
spi_exec_query('select pg_sleep(30)');
$_X$
LANGUAGE plperlu;
如果我select run_for_awhile()
在 psql 中执行,我可以输入Ctrl+C
并取消。在我正在做的实际应用程序中,select pg_cancel_backend(PID)
但我的测试通过该方法得到了相同的结果。
如果我修改函数以捕获 SIGINT 和/或 SIGTERM,则会发送信号,但该函数直到 30 秒后才注意到它(当 pg_sleep 完成时)。所以处理程序最终会运行,但不会“立即”运行。
IE
CREATE OR REPLACE FUNCTION run_for_awhile() RETURNS void
AS $_X$
$SIG{INT} = sub { die "Caught a sigint $!" };
spi_exec_query('select pg_sleep(30)');
$_X$
LANGUAGE plperlu;