Отменить функцию python из dotnet (Python.NET)

Я использую Python.NET для вызова библиотеки EasyOCR Python. В зависимости от контекста обнаружение может быть медленным (от 30 секунд до пары минут), и некоторые действия, выполняемые моим пользователем, могут привести к отмене задачи. Насколько я могу судить, токен отмены отменит задачу только при следующей инструкции С#, поэтому я застрял во время выполнения кода Python.

Я видел, что на стороне Python есть какой-то аналогичный механизм с использованием asyncio, но мне было интересно, есть ли способ избежать сложности дополнительной логики Python, имея возможность каким-то образом убить процесс Python. Или, может быть, какой-то простой способ как-то поделиться токеном.


person Amaury Levé    schedule 08.06.2021    source источник


Ответы (2)


Функция, очень похожая на то, что вы просите, недавно была добавлена ​​​​в Python.NET (возможно, вам придется использовать предварительные версии 3.0, но, вероятно, она не вошла в 2.5).

Это тестовый код, который был добавлен для этой функции. Я думаю, что это лучшая ссылка, которую вы сможете получить: //github.com/pythonnet/pythonnet/pull/1337/files#diff-e846713ba20ecf06af2cc88cc1e92bae49d519998b093d2fb0f7fd6644b10092

Обратите внимание и на метод SetUp. Там показано, как правильно настроить многопоточность.

person LOST    schedule 08.06.2021
comment
Любая идея ETA v3? И связанный с этим вопрос: насколько рискованно, по вашему мнению, использовать эту предварительную версию в небольшой рабочей среде (вы видели много потенциально рискованных PR-слияний? Вероятно ли, что API радикально изменится с настоящего момента до выпуска?) - person Amaury Levé; 08.06.2021
comment
ETA будет в конце 2021 года. В данный момент было бы довольно рискованно, если вы хотите обновлять предварительные версии. - person LOST; 09.06.2021

Нет хорошего способа прервать не взаимодействующий поток/задачу. Существует Thread.Abort, но использовать его — плохая идея. Ваши варианты более или менее

  1. Найдите способ перенаправить запрос на отмену в код Python.
  2. Не ждите результата при отмене задачи, а пусть задача продолжает работать в фоновом режиме.
  3. Запустите задачу в отдельном процессе и завершите процесс при отмене.
  4. Не допускайте отмены задачи.
person JonasH    schedule 08.06.2021
comment
Спасибо @JonasH. Я уже рассматривал эти варианты, для №1 это сложно, но у меня что-то работает. Для № 2 задача слишком ресурсоемкая, чтобы ее игнорировать. Что касается № 3, я не рассматривал это, я попробую. Для №4 тоже не вариант (аналогично №2). - person Amaury Levé; 08.06.2021