从 dotnet (Python.NET) 取消 python 函数

问题描述

我正在使用 Python.NET 调用 EasyOCR Python 库。根据上下文,检测可能会很慢(从 30 秒到几分钟),我的用户执行的某些操作可能会导致任务取消。据我所知,取消令牌只会在下一条 C# 指令时取消任务,所以我在 python 代码运行时被卡住了。

我已经看到使用 asyncio 在 Python 端有一些类似的机制,但我想知道是否有任何方法可以通过某种方式“杀死”python 进程来避免拥有额外的 python 逻辑的复杂性。或者也许是一些以某种方式共享令牌的简单方法

解决方法

最近在 Python.NET 中添加了与您所要求的非常相似的功能(尽管您可能需要使用 3.0 预览版,但它可能没有进入 2.5)。

这是为该功能添加的测试代码。我认为这是您可以获得的最佳参考:https://github.com/pythonnet/pythonnet/pull/1337/files#diff-e846713ba20ecf06af2cc88cc1e92bae49d519998b093d2fb0f7fd6644b10092

也要注意 SetUp 方法。它展示了如何正确设置多线程。

,

没有好的方法可以中止不合作的线程/任务。有 Thread.Abort,但使用它是一个 bad idea。您的选择或多或少

  1. 找出一种将取消请求转发给 python 代码的方法。
  2. 取消任务时停止等待结果,而是让任务继续在后台运行。
  3. 在单独的进程中运行任务,并在取消时终止进程。
  4. 不允许取消任务。