2016-10-28 4 views
0

Это короткий вопрос. Я считаю, что отменить работу, представленную libclang через привязки python (например, задачу завершения кода), невозможно.Отменить задачу libclang

Может ли кто-нибудь доказать мне, что я неправ? Я заинтересован в использовании libclang в многопоточной среде, но, похоже, он предназначен для доступа только из одного потока. Если также нет механизма для отмены задач, тогда нужно подождать, пока задача не завершится, даже если результаты больше не нужны. Есть ли у кого-нибудь идеи о том, как преодолеть это?

+0

libclang не является рабочей очередью, поэтому я не уверен, что это за «задание» или «задача», о которой вы говорите. – xaxxon

+0

Извините за неточность. То, что я имею в виду, это просто вызов функций через привязки python libclang. Я называю их задачами здесь, чтобы подчеркнуть, что я хотел бы назвать их одновременно. Давайте даже сосредоточимся только на завершении кода. Поэтому предположим, что у меня есть единица перевода, и я запускаю на нем функцию завершения кода. – niosus

+0

выполнение одновременных вызовов и отмена таких вещей не похоже на что-то, с чем связан libclang. Конечно, если libclang не является потоковым, тогда ничто из этого не имеет значения, но если это все, что вам нужно, вы должны задать этот конкретный вопрос. – xaxxon

ответ

1

[..] Кажется, он предназначен для доступа только из одной нити.

У меня нет ничего, что явно резервное, но в документации нигде даже переговоры о безопасности потока я не думаю, что все libclang следует рассматривать не поточно.

Но: Зрение, что в основном все libclang делает (косвенно) связан с CXIndex я догадку, что вы могли бы иметь CXIndex на поток, а затем использовать их (или что-нибудь, что создал из них) параллельно (но не «делиться» чем угодно между потоками).

Если также нет механизма для отмены задач, необходимо подождать, пока задача не завершится, даже если результаты больше не нужны. Есть ли у кого-нибудь идеи о том, как преодолеть это?

«Безопасное» решение состоит в том, чтобы переместить весь связанный с libclang код в выделенный процесс. Из основного приложения вы запускаете (или убиваете) эти процессы (используя механизмы, зависящие от ОС) по своему усмотрению. Это, конечно, «тяжело» с точки зрения как производительности (начальных процессов), так и усилий разработчиков (сериализация связи между процессами).

Альтернатива - надеяться (или проверить в исходном коде), что разработчики libclang сохраняют все данные, связанные с CXIndex и, таким образом, не вводят возможные коды данных в свой код. Затем вы можете дать каждому потоку собственный индекс, свои единицы перевода и т. Д. Когда у вас есть «задание», вы запускаете поток (или повторно используете его) для работы над ним. Если в то же время результаты больше не нужны, вы просто отбрасываете результаты, когда (если) они когда-либо готовятся.

Смежные вопросы