With the introducing of the async API the Prolog interpreter is able to process promises when in async mode. So far sleep/1 is the first predicate that relinquishes control. Further opportunities for the future will be input/output predicates. Last but not least the frequent garbage collection can be used to relinquish control on a regular basis.
The following timer predicates are provided: