I found out when I introduce a dummy async method on a Ray Actor class but don’t call it, the order of execution becomes messed up.
import ray import time @ray.remote class Foo: def __init__(self): self.value = 0 def setter(self, value): self.value = value def getter(self): return self.value async def dummy(self): raise NotImplementedError if __name__ == '__main__': ray.init() for i in range(10): bar = Foo.remote() bar.setter.remote(i) # time.sleep(0.1) print(ray.get(bar.getter.remote()))
The code should print numbers from 0 to 9, but actually prints out 10 zeros.
Commenting out the async method shows the expected behavior.
Uncommenting the sleep line to give the actor enough processing time also works.
(Tested on Ray 1.9.2 on Python 3.8, Ubuntu 18.04, on clean installation on fresh conda environment)
Without any prior knowledge on async actors, it is unnatural as the order of the execution is affected by some unrelated code. However, in the context of async actors, I’m not sure whether it is a feature or a bug.
Is it a correct behavior, that calling sync methods on an async actor may execute out of order?