python.net 的多线程

Multithreading with python.net

我正在使用以下代码从 C# 调用 python:

if (!PythonEngine.IsInitialized)
{
    PythonEngine.Initialize();
    PythonEngine.BeginAllowThreads();
}
//var pythonScriptCommand = string.Format("{0}", Path.Combine(AppContext.BaseDirectory, "scripts" + Path.DirectorySeparatorChar + "keyringtest.py")); //Path.Combine(AppContext.BaseDirectory, "PythonSampleSystemDiagnostic.py");

IntPtr gs = PythonEngine.AcquireLock();

using (PyScope scope = Py.CreateScope())
{

    //foreach (var array in myCommand.Settings)
    //{
    //    Console.WriteLine(string.Join(" ", array)); ;
    //}
        string fileContent = File.ReadAllText(Path.Combine(@"../../Source/AMD.Agent.Standard.DataExchange/Commands/PythonScripts/", ScriptName));
        var file = PythonEngine.Compile(fileContent);

        scope.Execute(file);
        //dynamic accessToken = scope.Get("get_access_token");
    dynamic dataExtract = scope.Get("get_result_http");

    //_logger.Info(myCommand.Settings.ToString()   + "123123123123");
    var dict = myCommand.Settings.ToDictionary(x => x.SettingName, x => x.SettingValue);
    var dict123 = JsonConvert.SerializeObject(dict);
    dataExtract(token,url1,"PerformanceHistoryPeriod");
    //Console.WriteLine(_apxApiService + "123123123123123");
}

PythonEngine.ReleaseLock(gs);
PythonEngine.Shutdown();

引用了这个link: https://mail.python.org/pipermail/pythondotnet/2010-December/001058.html

我不确定这是如何工作的,如果我在不同线程中多次调用此代码,并行执行所有脚本 运行 或按顺序执行 运行,基于在锁上。

由于 global interpreter lock,我认为您不能使用 Python.NET 同时执行多个线程。您仍然可以在单独的线程中执行 python 代码,只是不能同时执行多个线程(至少目前如此)。

另一种方法是使用 IronPython,它提供 Python 2 语法的 .NET 实现 - 它可以很好地在多个线程中执行代码。

您可以在此处阅读有关使用 Python.NET 与 IronPython 的优缺点的更多信息:

https://www.alternetsoft.com/blog/python-net-iron-python-scripting