>  기사  >  백엔드 개발  >  Go로 작성된 Python 확장은 Ctrl+C를 무시합니다.

Go로 작성된 Python 확장은 Ctrl+C를 무시합니다.

王林
王林앞으로
2024-02-13 14:09:101242검색

用 Go 编写的 Python 扩展会忽略 Ctrl+C

php 편집기 Apple은 Go로 작성된 Python 확장이 Ctrl+C 신호를 처리할 때 문제가 있을 수 있다는 사실을 발견했습니다. 일반적으로 명령줄에서 Ctrl+C를 누르면 SIGINT 신호가 실행 중인 프로그램에 전송되어 실행을 중지하도록 요청합니다. 그러나 Go로 작성된 Python 확장은 이 신호를 무시하는 것으로 보이며 이로 인해 프로그램이 정상적으로 중지되지 않습니다. 이 문제는 Go를 사용하여 Python 확장을 작성하는 개발자에게 잠재적인 숨겨진 위험이므로 특별한 주의가 필요합니다. 따라서 개발 과정에서 프로그램이 정상적으로 종료될 수 있도록 이 문제를 해결할 수 있는 솔루션을 찾아야 합니다.

질문 내용

일부 서비스에 연결하고 일부 처리를 수행하는 go로 작성된 Python 드라이버를 사용하고 있습니다. 서비스의 "비정상" 인스턴스에서 문제를 발견했습니다. 이로 인해 드라이버가 중단되고 프로세스를 kill 처리하지 않으면 종료할 수 없게 되었습니다.

몇 가지 실험을 해보니 go로 작성된 확장을 실행할 때 프로그램이 방출된 ctrl+c 命令,直到控制权返回到 python,而使用 c 编写的扩展则不会发生这种情况,其中在执行时引发 keyboardinterrupt c代码。我的问题是为什么会发生这种情况以及是否有办法规避这个问题或发出某种超时。尝试使用 threading.timer 引发异常来模拟超时,但问题是该异常是在它自己的线程中引发的,并且不会中断主线程。在python(cpython)3.93.10中测试。至于我写的poc扩展,go版本是1.20.4,c编译器是9.4.0을 무시한다는 사실을 발견했습니다.

아래에 약간의 POC를 남겨두겠습니다.

파이썬 코드:

으아악

확장하러 가기

으아악

c 확장

import ctypes

import ctypes
go_library = ctypes.cdll.loadlibrary('./go_library.so')
hello_go = go_library.helloworld

c_library = ctypes.cdll.loadlibrary("./c_library.so")
hello_c = c_library.helloworld

try:
    print("calling golang code")
    hello_go()

    print("calling c code")
    hello_c()
except keyboardinterrupt:
    print("ctrl+c issued dd:")
finally:
    print("done")

Solution

저도 같은 상황에 직면했습니다. 약간의 연구 끝에 해결책을 찾았습니다.

이 답변 기준:

Python은 기본 인터프리터 루프에서 확인되는 플래그를 간단히 설정하는 신호 처리기를 sigint에 설치합니다. 이 핸들러가 제대로 작동하려면 Python 인터프리터가 Python 코드를 실행해야 합니다.

golang 코드를 실행할 때 golang은 Python이 설치된 sigint 신호 처리기를 호출하여 플래그를 설정하는 것 같습니다. 따라서 Python으로 다시 실행하면 키보드 인터럽트가 감지됩니다.

golang 문서에서:

(go가 아닌 프로그램이 go 코드를 호출할 때) 비동기 신호에 대해 알림이 호출되면 해당 신호에 대해 go 신호 처리기가 설치됩니다. 나중에 신호에 대해 재설정이 호출되면 신호의 원래 처리가 다시 설치되어 non-go 신호 처리기가 복원됩니다(있는 경우).

따라서 아래 코드는 go 코드에서 sigint를 캡처하고 sigint가 발생하자마자 함수를 반환합니다.

으아악

위 내용은 Go로 작성된 Python 확장은 Ctrl+C를 무시합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제