Use `asyncloop-run' to call a series of functions while keeping Emacs snappy and responsive to user activity. See the docstring of that function. It is long, but worth your while.