code: def compute_actor_handle_id_non_forked(actor_handle_id, current_task_id):
      
      assert isinstance(actor_handle_id, ActorHandleID)
      assert isinstance(current_task_id, TaskID)
      handle_id_hash = hashlib.sha1()
      handle_id_hash.update(actor_handle_id.binary())
      handle_id_hash.update(current_task_id.binary())
      handle_id = handle_id_hash.digest()
      return ActorHandleID(handle_id)
docs: Deterministically compute an actor handle ID in the non-forked case.
  
      This code path is used whenever an actor handle is pickled and unpickled
      (for example, if a remote function closes over an actor handle). Then,
      whenever the actor handle is used, a new actor handle ID will be generated
      on the fly as a deterministic function of the actor ID, the previous actor
      handle ID and the current task ID.
  
      TODO(rkn): It may be possible to cause problems by closing over multiple
      actor handles in a remote function, which then get unpickled and give rise
      to the same actor handle IDs.
  
      Args:
          actor_handle_id: The original actor handle ID.
          current_task_id: The ID of the task that is unpickling the handle.
  
      Returns:
          An ID for the new actor handle.