changeset 555:6fb469a3c382

Python plugin: documentation of orthanc.GenerateRestApiAuthorizationToken()
author Sebastien Jodogne <s.jodogne@gmail.com>
date Tue, 08 Dec 2020 16:46:50 +0100
parents 4f3a6145ae34
children 6a3d48510b0b
files Sphinx/source/plugins/python.rst
diffstat 1 files changed, 55 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/Sphinx/source/plugins/python.rst	Mon Dec 07 17:48:33 2020 +0100
+++ b/Sphinx/source/plugins/python.rst	Tue Dec 08 16:46:50 2020 +0100
@@ -718,6 +718,9 @@
 latter OS has a different model for `forking processes
 <https://en.wikipedia.org/wiki/Fork_(system_call)>`__.
 
+Using slave processes
+.....................
+
 .. highlight:: python
 
 Let us consider the following sample Python script that makes a
@@ -837,11 +840,27 @@
 changed in the constructor of the ``multiprocessing.Pool`` object, and
 are fully independent of the threads used by the Orthanc server.
 
+Obviously, an in-depth discussion about the ``multiprocessing``
+library is out of the scope of this document. There are many
+references available on Internet. Also, note that ``threading`` is not
+useful here, as Python multithreading is also limited by the GIL, and
+is more targeted at dealing with costly I/O operations or with the
+:ref:`scheduling of commands <python-scheduler>`.
+
+
+Slave processes and the "orthanc" module
+........................................
+
 .. highlight:: python
 
-Very importantly, pay attention to the fact that only the "master"
-Python interpreter has access to the Orthanc SDK. For instance, here
-is how you would parse a DICOM file in a slave process::
+Very importantly, pay attention to the fact that **only the "master"
+Python interpreter has access to the Orthanc SDK**. The "slave"
+processes have no access to the ``orthanc`` module.
+
+You must write your Python plugin so as that all the calls to
+``orthanc`` are moved from the slaves process to the master
+process. For instance, here is how you would parse a DICOM file in a
+slave process::
 
   import pydicom
   import io
@@ -859,12 +878,37 @@
       
 Communication primitives such as ``multiprocessing.Queue`` are
 available to exchange messages from the "slave" Python interpreters to
-the "master" Python interpreter if further calls to the Orthanc SDK
-are required.
+the "master" Python interpreter for more advanced scenarios.
+
+NB: Starting with release 3.0 of the Python plugin, it is possible to
+call the REST API of Orthanc from a slave process in a more direct
+way. The function ``orthanc.GenerateRestApiAuthorizationToken()`` can
+be used to create an authorization token that provides full access to
+the REST API of Orthanc (without have to set credentials in your
+plugin). Any HTTP client library for Python, such as `requests
+<https://requests.readthedocs.io/en/master/>`__, can then be used to
+access the REST API of Orthanc. Here is a minimal example::
 
-Obviously, an in-depth discussion about the ``multiprocessing``
-library is out of the scope of this document. There are many
-references available on Internet. Also, note that ``threading`` is not
-useful here, as Python multithreading is also limited by the GIL, and
-is more targeted at dealing with costly I/O operations or with the
-:ref:`scheduling of commands <python-scheduler>`.
+  import json
+  import multiprocessing
+  import orthanc
+  import requests
+  import signal
+  
+  TOKEN = orthanc.GenerateRestApiAuthorizationToken()
+  
+  def SlaveProcess():
+      r = requests.get('http://localhost:8042/instances',
+                       headers = { 'Authorization' : TOKEN })
+      return json.dumps(r.json())
+  
+  def Initializer():
+      signal.signal(signal.SIGINT, signal.SIG_IGN)
+  
+  POOL = multiprocessing.Pool(4, initializer = Initializer)
+  
+  def OnRest(output, uri, **request):
+      answer = POOL.apply(SlaveProcess)
+      output.AnswerBuffer(answer, 'text/plain')
+  
+  orthanc.RegisterRestCallback('/computation', OnRest)