2016-10-28 11 views
0

これは簡単な質問です。私はPythonのバインディング(例えばコード補完タスク)を通してlibclangに提出されたジョブをキャンセルする方法がないと信じています。libclangタスクをキャンセルする

誰かが間違っていると証明できますか?私はマルチスレッド環境でlibclangを使用することに興味がありますが、それは単一スレッドのみからのアクセスであると思われます。タスクをキャンセルするメカニズムもない場合、結果がもはや必要でなくてもタスクが終了するまで待たなければなりません。誰もこれを克服する方法についてのアイデアはありますか?

+0

libclangは作業キューではありませんので、どのような種類の「仕事」や「仕事」を指しているのかよくわかりません。 – xaxxon

+0

申し訳ありませんが不正確です。私が意味するのはlibclang pythonバインディングを使って関数を呼び出すことだけです。私はそれらを同時に呼び出そうとしていることを強調するために、ここで彼らの仕事と呼んでいます。コード補完だけに焦点を合わせましょう。翻訳ユニットがあり、コード補完機能を実行しているとします。 – niosus

+0

同時呼び出しを行い、そのようなことを取り消すことは、libclangが関係するようには聞こえません。もちろん、libclangがスレッドセーフでない場合、それは本当に問題になりませんが、それが必要な場合は、その特定の質問をする必要があります。 – xaxxon

答えて

1

[..]シングルスレッドからのアクセスのみを意図しているようです。

私はこれを明確にバックアップは何もありませんが、ドキュメントとしてどこでも会談スレッドの安全性について私はlibclangのすべてがスレッドセーフではありませんを考慮すべきだと思いません。

しかし:基本的にありませんlibclangすべては(間接的に)私は並列に使用すると、スレッドごとCXIndexを持っているし、それらの(またはそれらから作成されています何かを)使用することができを推測する(しかしないでしょうCXIndexにバインドされていることを見てスレッド間の何かを "共有"する)。

タスクをキャンセルするメカニズムもない場合は、結果がもう必要なくなってもタスクが終了するまで待つ必要があります。誰もこれを克服する方法についてのアイデアはありますか?

"安全な"解決策は、すべてのlibclang関連コードを専用のプロセスに移動することです。メインアプリケーションから、OS依存のメカニズムを使用して、これらのプロセスを好きなように開始(または終了)します。これは、もちろん、パフォーマンス(開始プロセス)と開発努力(プロセス間の通信のシリアライズ)の両方で「重い」ものです。

代わりに、libclang devsがすべてのデータをCXIndexに関連付けたままにしておき、コードにデータ競合が発生しないようにする(またはソースコードで確認する)こともできます。次に、すべてのスレッドに独自の索引、独自の翻訳単位などを与えることができます。「ジョブ」があるときは、スレッドを起動して(または再利用して)作業します。その間に結果が不要になった場合は、結果が破棄された時点で結果を破棄するだけです。

関連する問題