Run#

You can use Executor objects directly, just like a regular Python object.

One can instantiate an Executor object from a local Python class, or from the Executor Hub:

From a local Python class#

from jina import Executor, requests, DocumentArray, Document


class MyExec(Executor):
    @requests
    def foo(self, docs, **kwargs):
        for d in docs:
            d.text = 'hello world'


m = MyExec()
da = DocumentArray([Document(text='test')])
m.foo(da)
print(f'Text: {da[0].text}')
Text: hello world

From the Executor Hub#

You can pull an Executor from Executor Hub and use it directly as a Python object.

from docarray import Document, DocumentArray
from jina import Executor

executor = Executor.from_hub(
    uri='jinaai://jina-ai/CLIPTextEncoder', install_requirements=True
)

docs = DocumentArray(Document(text='hello'))
executor.encode(docs, {})

print(docs.embeddings.shape)
(1, 512)

Run inside an async eventloop#

If the Executor contains async functions, you can run it inside an asyncio eventloop.

import asyncio
from jina import Executor, requests


class MyExecutor(Executor):
    @requests
    async def foo(self, **kwargs):
        await asyncio.sleep(1.0)
        print(kwargs)


async def main():
    m = MyExecutor()
    call1 = asyncio.create_task(m.foo())
    call2 = asyncio.create_task(m.foo())
    await asyncio.gather(call1, call2)


asyncio.run(main())

Run as a process#

You can run an Executor from CLI. In this case, the Executor occupies one process. The lifetime of the Executor is the lifetime of the process.

From a local Executor#

With exec.py containing the definition of MyExec, now creating a new file called my-exec.yml:

jtype: MyExec
py_modules:
  - exec.py

This simply points Jina to our file and Executor class. Now we can run the command:

jina executor --uses my-exec.yml --port 12345

From Executor Hub#

In this example, we use CLIPTextEncoder to create embeddings for our Documents.

jina executor --uses jinaai+docker://jina-ai/CLIPTextEncoder
jina executor --uses jinaai://jina-ai/CLIPTextEncoder

This might take a few seconds, but in the end you should be greeted with the following message:

WorkerRuntime@ 1[L]: Executor CLIPTextEncoder started

Just like that, our Executor is up and running.