2010-01-21 2 views
0

플러그인으로 작업하는 응용 프로그램을 작성하고 있습니다. 플러그인 유형에는 EngineModel의 두 가지 유형이 있습니다. Engine 개체에는 Model.velocity() 메서드를 호출하는 update() 메서드가 있습니다. 성능두 파이썬 모듈 사이에 C 함수 포인터 전달

이러한 방법은 이 때로는 그들이 파이썬으로 작성되며, 때때로 문제는이 세력이 비싼 파이썬을 할 수 있다는 점이다 C.

에 기록 된 것을 의미 C로 작성 할 수 있습니다 추론 함수 호출은 Model.velocity()Engine.update()에 (또한 GIL을 다시 가져옵니다). API에 Model.get_velocity_c_func()과 같은 것을 추가하려고하면 Model 구현체가 velocity() 메서드의 C 버전에 대한 포인터를 반환 할 수 있으므로 Engine이 빠른 C 함수 호출을 수행 할 수 있습니다.

함수 포인터를 전달하는 데 사용해야하는 데이터 형식은 무엇입니까? 그리고 이것은 좋은 디자인입니까, 아니면 더 쉬운 방법일까요?

답변

1

이 목적을 위해 CObject (PyCOBject) 데이터 형식이 있습니다. void *를 유지하지만, 원하는 모든 데이터를 저장할 수 있습니다. 다른 라이브러리의 CObjects는 사용자 자신의 것으로 보이는 것처럼 잘못된 함수에 잘못된 CObject를 전달하지 않도록주의해야합니다.

더 많은 유형의 보안을 원한다면 자신의 PyType을 손쉽게 롤업 할 수 있습니다. 그것은 결국 올바른 유형의 포인터를 포함하고 있습니다.

+0

'모델'에서 '엔진'으로 어떻게 전달할 수 있습니까? 나는'Engine' 관점에서 보았을 때 현재 사용되는'Model'의 파이썬 인스턴스입니다.'Model'에 C 코드 ("존재하지 않을 수도 있습니다")를 "호출"하는 법을 모르겠습니다. '엔진'. –

+0

내 의견을 이해하지 못한다는 것을 알고 있습니다 ... 제 말은 어떻게 PyCObject를 C에서 Python으로 전달할 수 있습니까? –

+0

전혀 이해할 수 없지만, 지금 막 PyCObject_FromVoidPtr/PyCObject_AsVoidPtr을 양면에 사용합니다. 감사합니다 :) –