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
我正在使用以下代码从 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