如标题所述 - 出现
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();
我找到了一个有效的解决方案 https://github.com/pythonnet/pythonnet/issues/1587
不知道为什么它会起作用,因为我的代码应该只在一个线程上运行