저는 파이썬에 대한 실험을하고 싶었습니다. 자바 스크립트의 setTimeout 또는 setInterval과 같은 기능을 소개하고 이벤트 루프를 시작하기 위해 많은 블로킹 호출없이 비동기 동작을 포팅하고 싶습니다. C 모듈로 python GIL을 우회 할 수 있습니까?
는의가 (지금은 물론 작동하지 않는)이 예를 보자 :from mymod import set_timeout # of course we love the PEP8 :)
import sys, time
def say_finished():
time.sleep(2) # waiting, suppose here to have some blocking behaviour
sys.stdout.write("\nSee you!")
sys.stdout.write("Hello, ")
set_timeout(say_finished, 2000) # supposing we have msec granularity
sys.stdout.write("World!")
나는 자바 스크립트가하는 같은 동작을하고 싶습니다. set_timeout이 GIL로 인해 새 스레드를 시작한 경우 새로운 스레드가 완료 될 때까지 새 스레드가 차단되므로 "Hello, \ nSee you! World"가 여전히 인쇄됩니다.
set_timeout이 C 코드에서 posix 스레드를 사용하면이 동작을 피할 수 있습니까? 파이썬 C/API와의 통합이 될 것입니다. GIL을 우회 할 수 있는지 또는 API 자체가 GIL에 의해 차단되어야하는지 여부는 알지 못합니다.하지만 지금은 공부하고 있습니다. 워드 프로세서와 나는 그것을 스스로 시험해 볼 준비가되어 있지 않다).
다음과 같아야합니다 : "안녕하세요"-> set_timeout을 실행하십시오 (프로그램 실행을 계속하기 위해 돌아 가야합니다) -> "World!" -> 외부 스레드가 실행되는 동안 살아 남기 -> 콜백 "say_finished"-> 끝.
인터프리터 자체를 편집해야한다고 생각하는 이유는 "외부 스레드가 실행 중일 때 살아 있어야한다"는 부분입니다.
새 프로세스에서 생성하는 오버 헤드로 인해 프로세스를 사용하고 싶지 않습니다.
파이썬 구문이 좋기 때문에 "자바 스크립트 사용"이라고 말하지 마십시오.이 방법을 사용하고 싶습니다.
당신이 묘사하는 것은 거의 정확히'threading.Timer'입니다. http://docs.python.org/library/threading.html#timer-objects –