from __future__ import absolute_import, division, print_function
from ray import Language
from ray._raylet import CppFunctionDescriptor, JavaFunctionDescriptor
from ray.util.annotations import PublicAPI
__all__ = [
"java_function",
"java_actor_class",
"cpp_function",
]
[docs]
@PublicAPI(stability="beta")
def java_function(class_name: str, function_name: str):
"""Define a Java function.
Args:
class_name: Java class name.
function_name: Java function name.
"""
from ray.remote_function import RemoteFunction
return RemoteFunction(
Language.JAVA,
lambda *args, **kwargs: None,
JavaFunctionDescriptor(class_name, function_name, ""),
{},
)
@PublicAPI(stability="beta")
def cpp_function(function_name: str):
"""Define a Cpp function.
Args:
function_name: Cpp function name.
"""
from ray.remote_function import RemoteFunction
return RemoteFunction(
Language.CPP,
lambda *args, **kwargs: None,
CppFunctionDescriptor(function_name, "PYTHON"),
{},
)
[docs]
@PublicAPI(stability="beta")
def java_actor_class(class_name: str):
"""Define a Java actor class.
Args:
class_name: Java class name.
"""
from ray.actor import ActorClass
return ActorClass._ray_from_function_descriptor(
Language.JAVA,
JavaFunctionDescriptor(class_name, "<init>", ""),
{},
)
@PublicAPI(stability="beta")
def cpp_actor_class(create_function_name: str, class_name: str):
"""Define a Cpp actor class.
Args:
create_function_name: Create cpp class function name.
class_name: Cpp class name.
"""
from ray.actor import ActorClass
print("create func=", create_function_name, "class_name=", class_name)
return ActorClass._ray_from_function_descriptor(
Language.CPP,
CppFunctionDescriptor(create_function_name, "PYTHON", class_name),
{},
)
def _format_args(worker, args, kwargs):
"""Format args for various languages.
Args:
worker: The global worker instance.
args: The arguments for cross language.
kwargs: The keyword arguments for cross language.
Returns:
List of args and kwargs (if supported).
"""
if not worker.load_code_from_local:
raise ValueError(
"Cross language feature needs --load-code-from-local to be set."
)
if kwargs:
raise TypeError(
f"Cross language remote functions does not support kwargs, "
f"kwargs:{str(kwargs)}."
)
return args
def _get_function_descriptor_for_actor_method(
language: str, actor_creation_function_descriptor, method_name: str, signature: str
):
"""Get function descriptor for cross language actor method call.
Args:
language: Target language.
actor_creation_function_descriptor:
The function signature for actor creation.
method_name: The name of actor method.
signature: The signature for the actor method. When calling Java from Python,
it should be string in the form of "{length_of_args}".
Returns:
Function descriptor for cross language actor method call.
"""
if language == Language.JAVA:
return JavaFunctionDescriptor(
actor_creation_function_descriptor.class_name,
method_name,
signature,
)
elif language == Language.CPP:
return CppFunctionDescriptor(
method_name,
"PYTHON",
actor_creation_function_descriptor.class_name,
)
else:
raise NotImplementedError(
"Cross language remote actor method " f"not support language {language}"
)