문제

ctypes를 통해 호출하는 .so/.dll의 장기 실행 함수를 사용하는 Python GUI 앱이 있습니다.

별도의 스레드나 프로세스에서 실행되는 동안 함수와 통신하여 함수를 조기에 종료하도록 요청할 수 있는 방법을 찾고 있습니다(부분 결과를 반환하기 전에 C 측에서 일부 작업이 필요함).파이프에서 신호를 받거나 읽는 일종의 신호가 필요할 것이라고 생각하지만 가능한 한 간단하게 유지하고 싶습니다.

이런 종류의 문제를 해결하기 위한 최선의 접근 방식은 무엇이라고 생각하시나요?Python과 C 측면 모두에서 코드를 변경할 수 있습니다.

도움이 되었습니까?

해결책

여기에 대답해야 할 두 부분이 있습니다.하나는 두 프로세스(GUI와 함수를 실행하는 프로세스) 간에 통신하는 방법이고, 다른 하나는 비동기 요청에 응답하도록 함수를 변경하는 방법입니다("아, 내가 원하는 대로 반환하라는 지시를 받았습니다.") 있어요").

두 번째 질문에 대한 답을 알아내면 아마도 첫 번째 질문에 대한 답이 결정될 것입니다.신호로 이를 수행할 수 있습니다(이 경우 프로세스를 제어하는 ​​신호 처리기를 얻고, 다른 곳에서 더 자세한 지침을 찾을 수 있으며, 함수에 제어를 반환하기 전에 내부 데이터 구조를 변경할 수 있음). 또는 함수를 가질 수도 있습니다. 명령에 대한 제어 인터페이스를 모니터링합니다(밀리초마다 대기 중인 명령이 있는지 확인하고, 있으면 그것이 무엇인지 확인).

첫 번째 경우에는 ANSI C 신호 처리(signal(), singandler_t)가 필요할 것이고, 두 번째 경우에는 파이프 또는 이와 유사한(pipe() 및 select())가 필요할 것입니다.

다른 팁

C와 Python 측면을 모두 변경할 수 있다고 언급합니다. C로 소켓이나 신호 코드를 쓰지 않으려면 대형 C 함수를 설정, 작은 작업 소포 및 정리를 수행하는 3 개의 작은 별도 기능으로 나누는 것이 가장 쉬울 수 있습니다. 작업 소포는 응답 성과 오버 헤드가 낮은 균형을 맞추려면 약 1ms에서 1 초 사이 여야합니다. 데이터 크기 변경에 직면하여 이와 같은 덩어리로 계산을 분해하는 것은 어려울 수 있지만 I/O를 수행 한 단일 큰 기능에서도 동일한 도전을 가질 수 있습니다.

CTypes를 통해 해당 3 기능을 호출하는 Python으로 작업자 프로세스를 작성하십시오. 작업자 프로세스를 확인하게하십시오 대기줄 계산을 조기에 중지하려면 GUI의 메시지에 대한 객체. queue.get 대신 비 블로킹 queue.get_nowait 호출을 사용하십시오. 작업자 프로세스가 일찍 종료 할 메시지를 찾으면 C 정리 코드를 호출하고 부분 결과를 반환하십시오.

당신이 *nix에있는 경우 c 프로그램에서 sigusr1 또는 sigint에 대한 신호 핸들러를 등록한 다음 python에서 os.kill을 사용하여 신호를 보내십시오.

당신은 그것을 말했습니다 : 신호와 파이프.

너무 복잡 할 필요는 없지만 기존 구조를 사용하는 경우 자신의 구조를 시도하는 것보다 훨씬 쉬운 일입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top