Embedded Python - Blocking operations in time module
Asked Answered
C

1

7

I'm developing my own Python code interpreter using the Python C API, as described in the Python documentation. I've taken a look on the Python source code and I tried to follow the same steps that are carried out in the standard interpreter when executing a py file. These steps (sequence of C API function calls) are basically:

PyRun_AnyFileExFlags()
  PyRun_SimpleFileExFlags()
    PyRun_FileExFlags()
        PyArena_New()
        PyParser_ASTFromFile()
        run_mod()
            PyAST_Compile()
            PyEval_EvalCode()
                PyEval_EvalCodeEx()
                    PyThreadState_GET()
                    PyFrame_New()
                    PyEval_EvalFrameEx()

The only difference in my code is that I do manually the AST compilation, frame creation, etc. and then I call PyEval_EvalFrame.

With this, I am able to execute an arbitrary .py file with my program, as if it were the normal Python interpreter. My problem comes when the code that my program is executing makes use of the time module: all time module operations get blocked in the GIL! For example, if the Python code calls time.sleep(1), this call is blocked and never gets executed.

Obviously I am doing something wrong that blocks the GIL (and therefore blocks the time module) but I dont know how to correct it. The last statement in my code where I have control is in PyEval_EvalFrameEx, and from that point on, everything runs "as in regular Python interpreter", I think.

Anybody had a similar problem? What am I doing wrong, so that I block the time module? Hope somebody can help me...

Thanks for your time. Best regards,

R.

Cahoon answered 7/7, 2010 at 16:2 Comment(1)
I imagine your sleep is whats blocking the GIL. Any compelling reasons to be running a homebrew interpreter?Pinchbeck
S
1

You need to provide more detail.

  • How does your interpreter's behavior differ from the standard interpreter?
  • If you just want to run arbitrary source files, why are you not calling one of the higher level interfaces, like PyRun_SimpleFile? Did your code call Py_Initialize?
Slavish answered 20/12, 2010 at 9:56 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.