取消libclang任务

Cancel libclang task

本文关键字:任务 libclang 取消      更新时间:2023-10-16

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

谁能证明我错了?我对在多线程环境中使用libclang很感兴趣,但它似乎只是打算从单线程访问。如果也没有取消任务的机制,那么即使不再需要结果,也必须等待任务完成。有谁有办法解决这个问题吗?

[. .似乎它的目的是访问从单线程。

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

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

如果也没有取消任务的机制,那么即使不再需要结果,也必须等待任务完成。有谁有办法解决这个问题吗?

"安全"的解决方案是将所有libclang相关的代码移到一个专用的进程中。然后从主应用程序启动(或终止)这些进程(使用与操作系统相关的机制)。当然,就性能(启动进程)和开发工作(序列化进程之间的通信)而言,这是"繁重的"。

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