code: def test_get_non_exist_output(workflow_start_regular, tmp_path):
      lock_path = str(tmp_path / "lock")
  
      @ray.remote
      def simple():
          with FileLock(lock_path):
              return "hello"
  
      workflow_id = "test_get_non_exist_output"
  
      with FileLock(lock_path):
          dag = simple.options(
              **workflow.options(task_id="simple")
          ).bind()
          ret = workflow.run_async(dag, workflow_id=workflow_id)
          exist = workflow.get_output_async(
              workflow_id, task_id="simple"
          )
          non_exist = workflow.get_output_async(
              workflow_id, task_id="non_exist"
          )
  
      assert ray.get(ret) == "hello"
      assert ray.get(exist) == "hello"
      with pytest.raises(ValueError, match="non_exist"):
          ray.get(non_exist)
  
file_path: ray/python/ray/workflow/tests/test_basic_workflows_2.py
imports: import pytest
  import ray
  from filelock import FileLock
  from ray._private.test_utils import SignalActor
  from ray import workflow
  from ray.tests.conftest import *
  from ray._private.test_utils import skip_flaky_core_test_premerge
label_desc: Use image node_id 8 for calling a global function with example usage: test_get_non_exist_output(workflow_start_regular, tmp_path) and returns: str