取消 libclang 任务

Cancel libclang task

这是一个简短的问题。我相信没有办法取消通过 python 绑定提交给 libclang 的作业(例如代码完成任务)。

有人能证明我错了吗?我对在多线程环境中使用 libclang 很感兴趣,但它似乎旨在仅从单线程进行访问。如果也没有取消任务的机制,那么即使不再需要结果,也必须等到任务完成。有人对如何克服这个有任何想法吗?

[..] it seems it is intended to be accesses from single thread only.

我没有任何明确支持这一点的东西,但是由于文档甚至 都没有谈论 关于线程安全我认为所有的 libclang 都应该被考虑 不线程安全.

但是:看到基本上 libclang 所做的一切都(间接地)绑定到一个 CXIndex 我会 猜测 每个线程你可以有一个 CXIndex然后并行使用那些(或从它们创建的任何东西)(但不是 "share" 线程之间的任何东西)。

If there is also no mechanism to cancel tasks, then one has to wait till the task finishes even if the results are not needed anymore. Does anybody have any ideas on how to overcome this?

"safe"解决方案是将所有与libclang相关的代码移动到专用进程中。从您的主应用程序中,您可以随心所欲地启动(或终止)这些进程(使用 OS 依赖机制)。当然,就性能(启动进程)和开发工作(进程间的序列化通信)而言,这 "heavy"。

另一种方法是希望(或在源代码中验证)libclang 开发人员将所有数据都与 CXIndex 相关联,从而不会在他们的代码中引入可能的数据竞争。然后你可以给每个线程它自己的索引,它自己的翻译单元等。当你有一个 "job" 时,你启动一个线程(或重用一个)来处理它。如果同时不再需要结果,那么您只需在(如果)它们准备好时丢弃结果。