class_docstr: Wrap node as beam DoFn.
class_docstr_tok: ["Wrap","node","as","beam","DoFn","."]
docstr: Executes node based on signals.
  
  Args:
    element: a signal element to trigger the node.
    *signals: side input signals indicate completeness of upstream nodes.
docstr_tok: ["Executes","node","based","on","signals",".","Args",":","element",":","a","signal","element","to","trigger","the","node",".","*","signals",":","side","input","signals","indicate","completeness","of","upstream","nodes","."]
code: def process(self, element: Any, *signals: Iterable[Any]) -> None:
      """Executes node based on signals.
  
      Args:
        element: a signal element to trigger the node.
        *signals: side input signals indicate completeness of upstream nodes.
      """
      for signal in signals:
          assert not list(signal), "Signal PCollection should be empty."
  
      logging.info("node %s is running.", self._node_id)
      self._run_node()
      logging.info("node %s is finished.", self._node_id)
  
imports: import datetime
  from typing import Any, Iterable, List, Optional
  from absl import logging
  import apache_beam
  from tfx.dsl.compiler import constants
  from tfx.orchestration import metadata
  from tfx.orchestration.beam.legacy import beam_dag_runner
  from tfx.orchestration.config import pipeline_config
  from tfx.orchestration.local import runner_utils
  from tfx.orchestration.portable import launcher
  from tfx.orchestration.portable import partial_run_utils
  from tfx.orchestration.portable import runtime_parameter_utils
  from tfx.orchestration.portable import tfx_runner
  from tfx.proto.orchestration import local_deployment_config_pb2
  from tfx.proto.orchestration import pipeline_pb2
  from tfx.utils import telemetry_utils
  from google.protobuf import any_pb2
  from google.protobuf import message
label_desc: Use image node_id 2 for calling the PipelineNodeAsDoFn obj's underlying member method code with example usage: obj.process(element) without return types