mirror of
https://github.com/wassname/ray.git
synced 2026-07-08 20:00:33 +08:00
Enable actor methods to be decorated on the caller side also and get postprocessors. (#4732)
* Allow decorating ray actor methods. * Add test. * Add get postprocessors. * Improve documentation. * Make it work for remote functions. * Temporary fix.
This commit is contained in:
committed by
Philipp Moritz
parent
897b35ce36
commit
d81e71e297
@@ -2576,3 +2576,35 @@ def test_init_exception_in_checkpointable_actor(ray_start_regular,
|
||||
errors = relevant_errors(ray_constants.TASK_PUSH_ERROR)
|
||||
assert len(errors) == 2
|
||||
assert error_message1 in errors[1]["message"]
|
||||
|
||||
|
||||
def test_decorated_method(ray_start_regular):
|
||||
def method_invocation_decorator(f):
|
||||
def new_f_invocation(args, kwargs):
|
||||
# Split one argument into two. Return th kwargs without passing
|
||||
# them into the actor.
|
||||
return f([args[0], args[0]], {}), kwargs
|
||||
|
||||
return new_f_invocation
|
||||
|
||||
def method_execution_decorator(f):
|
||||
def new_f_execution(self, b, c):
|
||||
# Turn two arguments into one.
|
||||
return f(self, b + c)
|
||||
|
||||
new_f_execution.__ray_invocation_decorator__ = (
|
||||
method_invocation_decorator)
|
||||
return new_f_execution
|
||||
|
||||
@ray.remote
|
||||
class Actor(object):
|
||||
@method_execution_decorator
|
||||
def decorated_method(self, x):
|
||||
return x + 1
|
||||
|
||||
a = Actor.remote()
|
||||
|
||||
object_id, extra = a.decorated_method.remote(3, kwarg=3)
|
||||
assert isinstance(object_id, ray.ObjectID)
|
||||
assert extra == {"kwarg": 3}
|
||||
assert ray.get(object_id) == 7 # 2 * 3 + 1
|
||||
|
||||
@@ -2892,3 +2892,32 @@ def test_redis_lru_with_set(ray_start_object_store_memory):
|
||||
|
||||
# Now evict the object from the object store.
|
||||
ray.put(x) # This should not crash.
|
||||
|
||||
|
||||
def test_decorated_function(ray_start_regular):
|
||||
def function_invocation_decorator(f):
|
||||
def new_f(args, kwargs):
|
||||
# Reverse the arguments.
|
||||
return f(args[::-1], {"d": 5}), kwargs
|
||||
|
||||
return new_f
|
||||
|
||||
def f(a, b, c, d=None):
|
||||
return a, b, c, d
|
||||
|
||||
f.__ray_invocation_decorator__ = function_invocation_decorator
|
||||
f = ray.remote(f)
|
||||
|
||||
result_id, kwargs = f.remote(1, 2, 3, d=4)
|
||||
assert kwargs == {"d": 4}
|
||||
assert ray.get(result_id) == (3, 2, 1, 5)
|
||||
|
||||
|
||||
def test_get_postprocess(ray_start_regular):
|
||||
def get_postprocessor(object_ids, values):
|
||||
return [value for value in values if value > 0]
|
||||
|
||||
ray.worker.global_worker._post_get_hooks.append(get_postprocessor)
|
||||
|
||||
assert ray.get(
|
||||
[ray.put(i) for i in [0, 1, 3, 5, -1, -3, 4]]) == [1, 3, 5, 4]
|
||||
|
||||
Reference in New Issue
Block a user