2016-10-28 2 views
0

C'est une question courte. Je crois qu'il n'y a aucun moyen d'annuler un travail soumis à libclang à travers des liaisons python (par exemple la tâche d'achèvement de code).Annuler la tâche libclang

Quelqu'un peut-il me prouver? Je suis intéressé par l'utilisation de libclang dans un environnement multithread mais il semble que ce soit uniquement à partir d'un seul thread. S'il n'y a pas non plus de mécanisme pour annuler les tâches, il faut attendre que la tâche se termine même si les résultats ne sont plus nécessaires. Est-ce que quelqu'un a des idées sur la façon de surmonter cela?

+0

libclang n'est pas une file d'attente de travail, donc je ne suis pas sûr de ce genre de « travail » ou « tâche », vous faites référence. – xaxxon

+0

Désolé d'être imprécis. Ce que je veux dire, c'est juste appeler des fonctions via les bindings libclang python. Je les appelle des tâches ici pour souligner que je voudrais les appeler simultanément. Mettons même seulement l'accent sur l'achèvement du code pour le moment. Supposons donc que j'ai une unité de traduction et que j'exécute la fonction d'achèvement du code. – niosus

+0

faire des appels simultanés et annuler de telles choses ne ressemble pas à quelque chose que libclang serait impliqué. Bien sûr, si libclang n'est pas threadsafe alors rien de tout cela n'a vraiment d'importance, mais si c'est tout ce dont vous avez besoin, vous devriez poser cette question spécifique. – xaxxon

Répondre

1

[..] il semble qu'il est destiné à être accessible à partir d'un seul fil.

Je n'ai pas tout ce qui soutient clairement, mais comme la documentation nulle part même parle sur la sécurité des fils, je pense que tous libclang devrait être considéré comme pas thread-safe.

Mais: Seeing que, fondamentalement, tout libclang fait est (indirectement) lié à un CXIndex je suppose que vous pourriez avoir un CXIndex par fil, puis utilisez les (ou tout ce qui est créé à partir d'eux) en parallèle (mais pas "partager" n'importe quoi entre les threads).

S'il n'y a pas de mécanisme pour annuler les tâches, puis il faut attendre jusqu'à ce que la tâche se termine même si les résultats ne sont plus nécessaires. Est-ce que quelqu'un a des idées sur la façon de surmonter cela?

La solution « sûre » est de déplacer tout le code lié libclang dans un processus dédié. À partir de votre application principale, vous commencez (ou détruisez) ces processus (en utilisant des mécanismes dépendant du système d'exploitation) comme vous le souhaitez. Ceci est, bien sûr, "lourd" en termes de performance (processus de démarrage) et d'effort de développement (sérialisation de la communication entre les processus).

L'alternative est d'espérer (ou vérifier dans le code source) que les devs libclang garder toutes les données associées à un CXIndex et donc ne présentent pas des races de données possibles dans leur code. Ensuite, vous pouvez donner à chaque thread son propre index, ses propres unités de traduction, etc. Lorsque vous avez un "job", vous lancez un thread (ou réutilisez-en un) pour travailler dessus. Si, dans le même temps, les résultats ne sont plus nécessaires, il vous suffit d'ignorer les résultats quand (si) ils sont prêts.