2010-01-21 5 views
0

J'écris une application fonctionnant avec des plugins. Il existe deux types de plugins: Engine et Model. Les objets Engine ont une méthode update() qui appelle la méthode Model.velocity().Passer des pointeurs de fonction C entre deux modules python

Pour des performances raisons pour lesquelles ces méthodes sont autorisés à écrire en C. Cela signifie que, parfois, ils seront écrits en Python et parfois écrit en C.

Le problème est que ces forces pour faire un Python cher appel de fonction de Model.velocity() en Engine.update() (et également réacquérir le GIL). J'ai pensé à ajouter quelque chose comme Model.get_velocity_c_func() à l'API, qui permettrait aux implémentations Model de renvoyer un pointeur vers la version C de leur méthode velocity() si disponible, permettant à Engine d'effectuer un appel de fonction C plus rapide.

Quel type de données dois-je utiliser pour passer le pointeur de fonction? Et est-ce un bon design du tout, peut-être il y a un moyen plus facile?

Répondre

1

Le type de données CObject (PyCOBject) existe à cette fin. Il contient un vide *, mais vous pouvez stocker toutes les données que vous souhaitez. Vous devez faire attention de ne pas passer le mauvais CObject aux mauvaises fonctions, car les objets CObjects d'autres bibliothèques ressembleront aux vôtres.

Si vous voulez plus de sécurité de type, vous pouvez facilement lancer votre propre PyType pour cela; tout ce qu'il a à faire, après tout, c'est de contenir un pointeur du bon type.

+0

Comment est-ce que je peux passer ceci de mon 'Model' au' Engine'? Tout ce que j'ai du point de vue du moteur est une instance Python du 'Model' actuellement utilisé, je ne sais pas comment" appeler "le code C (qui peut même pas exister) dans le' Model' du 'Moteur'. –

+0

Je réalise que mon commentaire n'a pas de sens ... Je veux dire, comment puis-je passer un PyCObject de C à Python? –

+0

Peu importe ce que je comprends maintenant, je fais juste PyCObject_FromVoidPtr/PyCObject_AsVoidPtr des deux côtés, merci :) –

Questions connexes