C# 从parallel.for循环调用Pythonnet

C# 从parallel.for循环调用Pythonnet,c#,multithreading,parallel-processing,python.net,C#,Multithreading,Parallel Processing,Python.net,我正在c#应用程序中成功地使用pythonnet。现在我尝试从parallel.for循环调用pythonnet代码 常规for循环工作正常,但在使用parallel时不行。程序没有响应,也没有显示错误消息 (我也尝试了不同的方法来实现这一点,包括显式调用Py.GIL和使用线程。但无法让它运行) 以下是我的代码的简化版本: static void Main(string[] args) { PythonEngine.Initialize(); dy

我正在c#应用程序中成功地使用pythonnet。现在我尝试从parallel.for循环调用pythonnet代码

常规for循环工作正常,但在使用parallel时不行。程序没有响应,也没有显示错误消息

(我也尝试了不同的方法来实现这一点,包括显式调用Py.GIL和使用线程。但无法让它运行)

以下是我的代码的简化版本:

    static void Main(string[] args)
    {
        PythonEngine.Initialize();
        dynamic np = PythonEngine.ImportModule("numpy");

        dynamic[] Output = new dynamic[10];
        dynamic[] Output2 = new dynamic[10];

        for (int i = 0; i < 10; i++)
        {
            Output[i] = np.cos(np.pi * i);
        }

        Parallel.For(0, 10, i =>
        {
            Output2[i] = np.cos(np.pi * 2);
        });

        Console.ReadLine();
    }
static void Main(字符串[]args)
{
PythonEngine.Initialize();
动态np=PythonEngine.ImportModule(“numpy”);
动态[]输出=新的动态[10];
动态[]输出2=新的动态[10];
对于(int i=0;i<10;i++)
{
输出[i]=np.cos(np.pi*i);
}
对于(0,10,i=>
{
输出2[i]=np.cos(np.pi*2);
});
Console.ReadLine();
}
简短回答:(您的)Python是单线程的

答案很长:在谷歌上快速搜索
PythonEngine.ImportModule
会得到一个
np
是一个PyObject。从同一目录中的pyobject.cs和runtime.cs文件中,我们可以看到调用
np.cos
是线程独立的,除了对外部Python库的PInvoke之外。从PythonNet项目页面,它绑定到CPython。 然而,CPython在解释器上有一个全局锁;看

可能的解决方案:如果您需要使用Python,请尝试使用不同的运行时(例如,IronPython,它是dotnet上的本机)。

简短回答:(您的)Python是单线程的

答案很长:在谷歌上快速搜索
PythonEngine.ImportModule
会得到一个
np
是一个PyObject。从同一目录中的pyobject.cs和runtime.cs文件中,我们可以看到调用
np.cos
是线程独立的,除了对外部Python库的PInvoke之外。从PythonNet项目页面,它绑定到CPython。 然而,CPython在解释器上有一个全局锁;看

可能的解决方案:如果您需要使用Python,请尝试使用不同的运行时(例如,IronPython,它是dotnet上的本机)