    def push(self, cmds: List[str], process_result_callback: Callable):
        """
        Schedule the profiler for execution in a separate process,
        Call the callback after subprocess completion

        Parameters
        ----------
        cmds : List[str]
            argv for the launched profiler
        process_result_callback : Callable
            Called after subprocess completion in the main process
            (but possibly not main thread).
            Currently used to aggregate profiler results,
            so the callable takes `result` and `postprocessing_delegate` parameters
            It is also used to propagate the profiler launch context to the aggregation point,
            namely, split_k value for the gemm profilers
        """
        future = self._executor.submit(
            run_task, cmds, self._device_queue, self._dev_select_flag
        )

        # done callbacks are used to collect profiler results for postprocessing
        # they are launched asynchronously, in a separate thread,
        # some time after a future holding profiler result completes
        def callback_when_done(fut):
            stdout = None
            stderr = None
            try:
                stdout, stderr = fut.result()
                profile_result, err = extract_profile_result(stdout)
                if err:
                    _LOGGER.error(
                        f"Profiler failure!\nProfiler stdout: {stdout}\nProfiler stderr: {stderr}",
                    )
                    raise RuntimeError(f"Failed to extract profiler result for {cmds}")
                process_result_callback(profile_result, self._postprocessing_delegate)
            finally:
                # unblock one future in `join()`
                if stdout is not None:
                    self._done_queue.put(stdout)

        future.add_done_callback(callback_when_done)
        self._futures.append(future)
        self._cmds.append(cmds)
Schedule the profiler for execution in a separate process,
Call the callback after subprocess completion

Parameters
----------
cmds : List[str]
argv for the launched profiler
process_result_callback : Callable
Called after subprocess completion in the main process
(but possibly not main thread).
Currently used to aggregate profiler results,
so the callable takes `result` and `postprocessing_delegate` parameters
It is also used to propagate the profiler launch context to the aggregation point,
namely, split_k value for the gemm profilers
python/aitemplate/backend/profiler_runner.py