从parallel.for循环调用Pythonnet

时间:2019-04-25 11:39:29

标签: c# multithreading parallel-processing python.net

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

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

(我还尝试了其他方法来执行此操作,包括显式调用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();
    }

1 个答案:

答案 0 :(得分:0)

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

长答案:快速搜索Google PythonEngine.ImportModule会得到relevant file in the github repo,而np是PyObject。从同一目录中的pyobject.cs和runtime.cs文件中,我们可以看到调用np.cos是线程无关的,除了对外部Python库的PInvoke之外。在PythonNet项目页面http://pythonnet.github.io/中,它与CPython绑定。 但是,CPython在解释器上具有全局锁定。参见Does Python support multithreading? Can it speed up execution time?

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