2010-07-07 2 views
7

파이썬 문서에서 설명한대로 파이썬 C API를 사용하여 자신의 파이썬 코드 인터프리터를 개발하고 있습니다. Python 소스 코드를 살펴 보았고 py 파일을 실행할 때 표준 인터프리터에서 수행되는 것과 동일한 단계를 수행하려고했습니다. 이 단계 (C API 함수 호출의 순서는) 기본적으로 다음과 같습니다임베디드 파이썬 - 시간 모듈에서의 조작 차단

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

내 코드의 유일한 차이가 나는 등, 수동 AST 편집, 프레임 생성 할 다음 내가 PyEval_EvalFrame를 호출 할 것입니다.

이걸로 내 프로그램으로 보통의 파이썬 인터프리터처럼 임의의 .py 파일을 실행할 수 있습니다. 내 문제는 내 프로그램에서 실행중인 코드가 시간 모듈을 사용하게되면서 발생합니다. 모든 시간에 모듈 작업이 GIL에서 차단됩니다! 예를 들어, 파이썬 코드가 time.sleep (1)을 호출하면이 호출은 차단되고 절대로 실행되지 않습니다.

분명히 나는 ​​GIL을 차단하는 (그리고 따라서 시간 모듈을 차단하는) 잘못된 것을하고있다. 그러나 그것을 교정하는 방법을 모른다. 필자가 코드를 제어 할 수있는 마지막 문장은 PyEval_EvalFrameEx에 있으며 그 시점부터 모든 것이 "일반 파이썬 인터프리터처럼"실행됩니다.

아무도 비슷한 문제가 있습니까? 시간 모듈을 차단하기 위해 내가 뭘 잘못하고 있니? 누군가가 나를 도울 수 있기를 바랍니다 ...

시간 내 주셔서 감사합니다. 안부 인사,

R.

+0

나는 당신의 수면이 GIL을 차단하는 것이라고 상상합니다. 자작농 통역사를 운영해야하는 이유는 무엇입니까? – synthesizerpatel

답변

1

자세한 내용을 제공해야합니다.

  • 귀하의 통역관의 행동은 표준 통역관과 어떻게 다릅니 까?
  • 임의의 소스 파일 만 실행하려는 경우 PyRun_SimpleFile과 같은 상위 수준 인터페이스 중 하나를 호출하지 않는 이유는 무엇입니까? 코드를 Py_Initialize (으)로 했습니까?