Thanks for the tip! I learned outer code of function exec_simple_query and I seen "idle" condition of calling ProcessCompletedNotifies! In my postgres job scheduler https://github.com/RekGRpth/pg_task I copied exec_simple_query and modified it to call ProcessCompletedNotifies after CommitTransactionCommand and it works!
And how about several transaction in new procedures?
That does seem like a legitimate gripe.
create or replace procedure foo() LANGUAGE plpgsql as $$ begin
FOR i IN 1..100 LOOP perform pg_notify('channel','HI'); perform pg_sleep(1);
commit; end loop; end; $$;
CALL foo();
An actively polling listener gets all notification all at once at the end. (I just use psql with a "LISTEN channel;" and the repeatedly execute ";" to get it to poll)