c244a9c833
UnsafeLocalCodeExecutor ran each program as a multiprocessing spawn child, which had to import this package before it could run a single line, costing about 2.3 seconds per execution. It now runs the program in a plain child interpreter, the shape ContainerCodeExecutor already uses, which brings a trivial program down to about 35 milliseconds. The result now comes from the child's exit status and pipes rather than a queue the child has to write to, so a program that dies without reporting anything no longer leaves the agent waiting forever, and the traceback the model is shown no longer opens with a frame from inside this package. One behavior change follows from taking the result from the exit status: a program calling sys.exit(0) is now reported as having succeeded. It was previously reported as a failure, because the spawn child raised SystemExit before it could write to the result queue. Co-authored-by: George Weale <gweale@google.com> PiperOrigin-RevId: 967496975