Вызов Pythonnet из цикла parallel.for - PullRequest
1 голос
/ 25 апреля 2019

Я успешно использую pythonnet в приложении ac #.Сейчас я пытаюсь вызвать код pythonnet из цикла parallel.for.

Обычный цикл 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 голосов
/ 25 апреля 2019

Краткий ответ: (Ваш) Python однопоточный.

Длинный ответ: Быстрый поиск в Google для PythonEngine.ImportModule приводит к релевантному файлу в репозитории github , а np является PyObject. Из файлов pyobject.cs и runtime.cs в том же каталоге мы видим, что вызов np.cos не зависит от потока, за исключением PInvoke для внешней библиотеки Python. Со страницы проекта PythonNet http://pythonnet.github.io/, он связывается с CPython. Тем не менее, CPython имеет глобальную блокировку интерпретатора; см. Поддерживает ли Python многопоточность? Может ли это ускорить время выполнения? .

Возможное решение: если вам нужно использовать Python, попробуйте использовать другую среду выполнения (например, IronPython, встроенный в dotnet).

...