Changes

Jump to navigation Jump to search
6,780 bytes added ,  16:58, 1 March 2016
Created page with "This XQuery Module provides functions for evaluating XQuery expressions in separate threads. Query execution can both be parallelized and postponed to be execu..."
This [[Module Library|XQuery Module]] provides functions for evaluating XQuery expressions in separate threads. Query execution can both be parallelized and postponed to be executed asynchronously.

=Conventions=

All functions in this module are assigned to the <code><nowiki>http://basex.org/modules/async</nowiki></code> namespace, which is statically bound to the {{Code|async}} prefix. Errors will be bound to the same prefix.

=Parallelized Execution=

==async:fork-join==

{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|async:fork-join|$functions as function(*)*|item()*}}<br/ >{{Func|async:fork-join|$functions as function(*)*, $options as map(xs:string, xs:string)|item()*}}<br/ >
|-
|'''Summary'''
|This function executes the supplied functions in parallel. The following {{Code|$options}} are available:
* <code>threads</code>: maximum number of parallel threads (default: available number of cores)
* <code>thread-size</code>: number of functions to be evaluated by each thread (default: <code>1</code>)
|-
| '''Examples'''
|
* The following function sleeps in parallel; it will be finished in 1 second if your system has at least 2 cores:
<pre class='brush:xquery'>
async:fork-join(
for $i in 1 to 2
return function() { prof:sleep(1000) }
)
</pre>
* In the following query, up to two URLs will be requested in parallel:
<pre class='brush:xquery'>
let $urls := (1 to 4) ! ('http://url.com/path' || .)
let $funcs := $urls ! function() { http:send-request((), .) },
return async:fork-join($funcs, map { 'threads': 2 })
</pre>
|-
|'''Errors'''
|{{Error|unexpected|#Errors}} an unexpected error occurred while running a query or function in a separate thread.<br/>{{Error|out-of-range|#Errors}} a supplied option is out of range.<br/>
|}

=Asynchronous Execution=

==async:eval==

{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|async:eval|$query as xs:string|xs:string}}<br />{{Func|async:eval|$query as xs:string, $bindings as map(*)|xs:string}}<br />{{Func|async:eval|$query as xs:string, $bindings as map(*), $options as map(xs:string, xs:string)|xs:string}}<br />
|-
| '''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]].<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|check}}: indicates if the query result will be cached.
* {{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}}.
|-
| '''Errors'''
|{{Error|updating|#Errors}} the query contains update operations.
|-
| '''Examples'''
|
* {{Code|async:eval("1+3")}} returns a query id, e.g. {{Code|Query-abc}}. The result can be retrieved via a second query in the same BaseX context: {{Code|async:result("Query-abc")}}<br />
|}

==async:update==

{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|async:update|$query as xs:string|xs:string}}<br />{{Func|async:update|$query as xs:string, $bindings as map(*)|xs:string}}<br />{{Func|async:update|$query as xs:string, $bindings as map(*), $options as map(xs:string, xs:string)|xs:string}}<br />
|-
| '''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]].<br/>See [[#async:eval|async:eval]] for information on the <code>$bindings</code> and <code>$options</code> arguments.
|-
| '''Errors'''
|{{Error|non-updating|#Errors}} the query does not contain any update operations.<br/>
|-
| '''Examples'''
|
* <code>async:update("delete node db:open('db')//text()", map {}, map { 'cache': false() })</code> returns a query id. The text nodes of the database <code>db</code> will be deleted once the database is available for write access.
|}

==async:result==

{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|async:result|$id as xs:string|item()*}}
|-
| '''Summary'''
|Returns the result of an asynchronously executed query with the specified query {{Code|$id}}:
* Results can only be retrieved once. After retrieval, the cached result will be discarded.
* If the query raised an error, the error will be raised instead.
|-
| '''Errors'''
|{{Error|is-running|#Errors}} the query is still running.<br/>{{Error|unknown|#Errors}} the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped.<br/>
|-
| '''Examples'''
| The following query returns the results of an asynchronously executed query. It will succeed, because both the main and the asynchronous query do not include write operations on concurrently used databases:
<pre class='brush:xquery'>
let $query := async:eval('(1 to 10000000)[. = 1]')
return (
hof:until(
function($result) { not(async:is-running($query)) },
function($curr) { prof:sleep(10) },
()
),
async:result($query)
)
</pre>
|}

==async:is-running==

{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|async:is-running|$id as xs:string|xs:boolean}}
|-
| '''Summary'''
|Indicates if a query with the specified query {{Code|$id}} is currently being evaluated.
|-
| '''Errors'''
|{{Error|unknown|#Errors}} the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped.<br/>
|}

==async:stop==

{| width='100%'
|-
| width='120' | '''Signatures'''
|{{Func|async:stop|$id as xs:string|xs:boolean}}
|-
| '''Summary'''
|Cancels the execution of a query with the specified query {{Code|$id}}.
|-
| '''Errors'''
|{{Error|unknown|#Errors}} the supplied query id is unknown: The query result may already have been retrieved, or query execution may have been stopped.<br/>
|}

=Errors=

{| class="wikitable" width="100%"
! width="110"|Code
|Description
|-
|{{Code|unexpected}}
| An unexpected error occurred while running a query or function in a separate thread.
|-
|{{Code|out-of-range}}
| The supplied option is out of range.
|-
|{{Code|updating}}
| A query is expected to be non-updating, but it performs updates.
|-
|{{Code|non-updating}}
| A query is expected to be updating, but it does not perform updates.
|-
|{{Code|unknown}}
| The supplied query id is unknown or not available anymore.
|-
|{{Code|is-running}}
| A query is still running.
|}

=Changelog=

;Version 8.0

* Updated: Bound values may now contain no or more than one item in [[#client:query|client:query]].

;Version 7.5

* Added: [[#client:info|client:info]]

The module was introduced with Version 7.3.
Bureaucrats, editor, reviewer, Administrators
13,554

edits

Navigation menu