我有一个处理消息的 C# 应用程序,需要为收到的每条消息调用 python 代码。但是,如果我并行运行处理,我的 docker 容器就会崩溃并显示 139 退出代码。我如何在单独的 python 上下文中运行每个方法的 python 代码?
消息处理程序:
public class ProcessingConsumer : IConsumer<DumbClassOne>
{
private readonly ILogger<ProcessingConsumer> _logger;
public ProcessingConsumer(ILogger<ProcessingConsumer> logger)
{
_logger = logger;
}
public Task Consume(ConsumeContext<DumbClassOne> context)
{
_logger.LogInformation("---Handling event----");
using (new PythonEngine())
{
using (Py.GIL())
{
using (var scope = Py.CreateScope(Guid.NewGuid().ToString()))
{
dynamic py = scope;
py.Exec(System.IO.File.ReadAllText("run.py"));
// Redirect Python logs to .NET Core logger
dynamic pythonLogger = py.logger;
dynamic handler = new DotNetLogHandler(_logger);
pythonLogger.addHandler(handler);
py.log_something();
pythonLogger.removeHandler(handler);
Thread.Sleep(200);
}
}
}
return Task.CompletedTask;
}
}
只是不要每次都创建
PythonEngine
。在程序启动时创建一次。在没有迫切需要的情况下一直关闭它并不是一个好主意,而且无论如何一次只支持 1 个实例。