Hot Reload#

While developing your Orchestration, you may want it to reload automatically as you change the YAML configuration.

For this you can use the Orchestration’s reload argument to reload it with the updated configuration every time you change the YAML configuration.

Caution

This feature aims to let developers iterate faster while developing, but is not intended for production use.

Note

This feature requires watchfiles>=0.18 to be installed.

To see how this works, let’s define a Deployment in deployment.yml with a reload option:

jtype: Deployment
uses: ConcatenateTextExecutor
uses_with:
  text_to_concat: foo
with:
  port: 12345
  reload: True

Load and expose the Orchestration:

import os
from jina import Deployment, Executor, requests


class ConcatenateTextExecutor(Executor):
    @requests
    def foo(self, docs, **kwargs):
        for doc in docs:
            doc.text += text_to_concat


os.environ['JINA_LOG_LEVEL'] = 'DEBUG'


dep = Deployment.load_config('deployment.yml')

with dep:
    dep.block()

You can see that the Orchestration is running and serving:

from jina import Client, DocumentArray

c = Client(port=12345)

print(c.post(on='/', inputs=DocumentArray.empty(1))[0].text)
foo

You can edit the Orchestration YAML file and save the changes:

jtype: Deployment
uses: ConcatenateTextExecutor
uses_with:
  text_to_concat: bar
with:
  port: 12345
  reload: True

You should see the following in the Orchestration’s logs:

INFO   [email protected] change in Deployment YAML deployment.yml observed, restarting Deployment                                                   

After this, the behavior of the Deployment’s Executor will change:

from jina import Client, DocumentArray

c = Client(port=12345)

print(c.post(on='/', inputs=DocumentArray.empty(1))[0].text)
bar

To see how this works, let’s define a Flow in flow.yml with a reload option:

jtype: Flow
with:
  port: 12345
  reload: True
executors:
- name: exec1
  uses: ConcatenateTextExecutor

Load and expose the Orchestration:

import os
from jina import Flow, Executor, requests


class ConcatenateTextExecutor(Executor):
    @requests
    def foo(self, docs, **kwargs):
        for doc in docs:
            doc.text += 'add text '


os.environ['JINA_LOG_LEVEL'] = 'DEBUG'


f = Flow.load_config('flow.yml')

with f:
    f.block()

You can see that the Flow is running and serving:

from jina import Client, DocumentArray

c = Client(port=12345)

print(c.post(on='/', inputs=DocumentArray.empty(1))[0].text)
add text

You can edit the Flow YAML file and save the changes:

jtype: Flow
with:
  port: 12345
  reload: True
executors:
- name: exec1
  uses: ConcatenateTextExecutor
- name: exec2
  uses: ConcatenateTextExecutor

You should see the following in the Flow’s logs:

INFO   [email protected] change in Flow YAML flow.yml observed, restarting Flow                                                   

After this, the Flow will have two Executors with the new topology:

from jina import Client, DocumentArray

c = Client(port=12345)

print(c.post(on='/', inputs=DocumentArray.empty(1))[0].text)
add text add text