Difference between revisions of "Job Module"
Line 55: | Line 55: | ||
|- | |- | ||
| '''Summary''' | | '''Summary''' | ||
− | |Prepares the supplied {{Code|$query}} string for asynchronous execution and returns a query id. The query will be queued as described in the article on [[Transaction Management]], and the result will be cached in main-memory until it is fetched via [[#async:result|async:result]], or until {{Option|ASYNCTIMEOUT}} is exceeded.<br/>Variables and context items can be declared via {{Code|$bindings}} (see [[XQuery Module#xquery:eval|xquery:eval]] for more details). The {{Code|$options}} parameter contains evaluation options: | + | |Prepares the supplied {{Code|$query}} string for asynchronous execution and returns a query id. The query will be queued as described in the article on [[Transaction Management]], and the result will be cached in main-memory until it is fetched via [[#async:result|async:result]], or until {{Option|ASYNCTIMEOUT}} is exceeded. Queries may be updating.<br/>Variables and context items can be declared via {{Code|$bindings}} (see [[XQuery Module#xquery:eval|xquery:eval]] for more details). The {{Code|$options}} parameter contains evaluation options: |
* {{Code|cache}}: indicates if the query result will be cached or ignored (default: <code>true</code>). If the query result will not be cached, the query id will immediately be discarded after query execution, too. | * {{Code|cache}}: indicates if the query result will be cached or ignored (default: <code>true</code>). If the query result will not be cached, the query id will immediately be discarded after query execution, too. | ||
* {{Code|base-uri}}: set [https://www.w3.org/TR/xquery-31/#dt-static-base-uri base-uri property] for the query. This URI will be used when resolving relative URIs by functions such as {{Code|fn:doc}} (default: ''empty string''). | * {{Code|base-uri}}: set [https://www.w3.org/TR/xquery-31/#dt-static-base-uri base-uri property] for the query. This URI will be used when resolving relative URIs by functions such as {{Code|fn:doc}} (default: ''empty string''). | ||
− | |||
− | |||
− | |||
|- | |- | ||
| '''Examples''' | | '''Examples''' | ||
Line 71: | Line 68: | ||
}; | }; | ||
</pre> | </pre> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|} | |} | ||
Line 182: | Line 161: | ||
|{{Code|out-of-range}} | |{{Code|out-of-range}} | ||
| The supplied option is out of range. | | The supplied option is out of range. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
|- | |- | ||
|{{Code|unknown}} | |{{Code|unknown}} |
Revision as of 17:45, 3 April 2016
This XQuery Module provides functions for evaluating XQuery expressions in separate threads. Query execution can both be parallelized and postponed to be executed asynchronously.
Contents
Conventions
All functions in this module are assigned to the http://basex.org/modules/async
namespace, which is statically bound to the async
prefix. Errors will be bound to the same prefix.
Parallelized Execution
Parallel query execution is recommendable if you have various calls that require a lot of time, but cannot be sped up by rewriting the code. This is e. g. the case if external URLs are called. If you are parallelizing local data reads (such as accessing a database), your single-threaded query will usually be faster, because parallelized access to disk data will often lead to randomized access patterns, which can hardly be optimized by your HD or SSD.
async:fork-join
Signatures | async:fork-join($functions as function(*)*) as item()* async:fork-join($functions as function(*)*, $options as map(xs:string, xs:string)) as item()* |
Summary | This function executes the supplied (non-updating) functions in parallel. The following $options are available:
|
Examples |
async:fork-join( for $i in 1 to 2 return function() { prof:sleep(1000) } )
let $funcs := for $segment in 1 to 4 let $url := 'http://url.com/path' || $segment return function() { http:send-request((), $url) } return async:fork-join($funcs, map { 'threads': 2 }) |
Errors | unexpected : an unexpected error occurred while running a query or function in a separate thread.out-of-range : a supplied option is out of range. |
Asynchronous Execution
Asynchronous query execution is recommendable if a client does not, or cannot, wait until a request is fully processed. This is e. g. the case with web browsers, which will usually cancel a request after a specific timeout. In such cases, you can use asynchronous execution to trigger another server-side process, which will start the time-consuming process, and fetch the result later on as soon as it is available.
async:eval
Signatures | async:eval($query as xs:string) as xs:string async:eval($query as xs:string, $bindings as map(*)) as xs:string async:eval($query as xs:string, $bindings as map(*), $options as map(xs:string, xs:string)) as xs:string |
Summary | Prepares the supplied $query string for asynchronous execution and returns a query id. The query will be queued as described in the article on Transaction Management, and the result will be cached in main-memory until it is fetched via async:result, or until ASYNCTIMEOUT is exceeded. Queries may be updating.Variables and context items can be declared via $bindings (see xquery:eval for more details). The $options parameter contains evaluation options:
|
Examples |
declare %rest:POST("{$query}") %rest:path('/eval') function local:eval($query) { async:eval($query) }; |
async:result
Signatures | async:result($id as xs:string) as item()*
|
Summary | Returns the result of an asynchronously executed query with the specified query $id :
|
Errors | is-running : the query is still running.unknown : the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped. |
Examples |
declare %rest:path('/result/{$id}') function local:result($id) { async:result($id) };
let $query := async:eval('(1 to 10000000)[. = 1]') return ( hof:until( function($result) { async:finished($query) }, function($curr) { prof:sleep(10) }, () ), async:result($query) ) |
async:finished
Signatures | async:finished($id as xs:string) as xs:boolean
|
Summary | Indicates if the evaluation of a query with the specified query $id has finished. If false is returned, the query is still running. An error will be raised if the query result was not cached or has already been retrieved.
|
Errors | unknown : the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped. |
async:stop
Signatures | async:stop($id as xs:string) as empty-sequence()
|
Summary | Cancels the execution of a query with the specified query $id , or drops the query result if it has already been executed.
|
Errors | unknown : the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped. |
async:ids
Signatures | async:ids() as xs:string*
|
Summary | Returns the ids of all queries that are either being executed asynchronously, or that have been executed and the results of which have been cached. |
Examples |
|
Errors
Code | Description |
---|---|
unexpected
|
An unexpected error occurred while running a query or function in a separate thread. |
out-of-range
|
The supplied option is out of range. |
unknown
|
The supplied query id is unknown or not available anymore. |
is-running
|
A query is still running. |
Changelog
The module was introduced with Version 8.5.