Python.NET:Py.GIL 线程在 ASP.NET Core Razor 页面中加载需要很长时间

问题描述 投票:0回答:1

如标题所述 - 出现

OnGet
输出语句,但“到达此处行”需要很长时间才能出现在 Razor 页面之一中:

Index.cs.html.cs

public void OnGet() {
    Console.WriteLine("On get");
    using (Py.GIL()) {
        Console.WriteLine("Reached line here");
    }
}

对于上下文,我通过命令从模板中获取了 Razor 页面

dotnet new webapp

在运行应用程序之前,我在主 (

PythonEngine
) 文件中全局初始化
Program.cs

PythonEngine.Initialize();
当我在同一个文件或任何不是

Py.GIL

 razor 页面的 
.cs
 文件中使用它时,
.cshtml.cs
线程似乎会立即运行。

例如,如果我在

Resources.cs
中执行此操作,线程会立即加载到
Program.cs
文件中:

using Python.Runtime;

class Program 
{
    static void Main(string[] args) 
    {
        Runtime.PythonDLL = "/Library/Frameworks/Python.framework/Versions/3.12/bin/python3";
        PythonEngine.Initialize();
        Resources.initResources();
        // ...
    }
}   

Resources.cs

static class Resources 
{
    public static void initResources() 
    {
        using (Py.GIL()) 
        {
            Console.WriteLine("Reached line here"); // printed instantly
            // ...
        }

        Console.WriteLine("Thread ends here"); // printed and thread ended successfully

        // ...
    }
}

但是当我尝试在 Razor 页面中使用它时,

Py.GIL
线程不会加载。我可以让它工作的唯一方法是,如果我关闭
PythonEngine
,然后每次使用
PythonEngine
线程时再次重新启动
Py.GIL()

这是关机代码:

PythonEngine.Shutdown();
asp.net-core razor-pages python.net
1个回答
-2
投票

我找到了一个有效的解决方案 https://github.com/pythonnet/pythonnet/issues/1587

不知道为什么它会起作用,因为我的代码应该只在一个线程上运行

© www.soinside.com 2019 - 2024. All rights reserved.