Pythonnet 消息处理中的多个 python 实例

Pythonnet Multiple python instances in message handling

提问人:muhmuhhum 提问时间:11/8/2023 更新时间:11/10/2023 访问量:19

问:

我有一个处理消息的 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;
  }
}
Python C# 多线程 MassTransit python.net

评论


答:

0赞 LOST 11/10/2023 #1

只是不要每次都创造。在程序启动时创建一次。在没有迫切需要的情况下一直关闭它不是一个好主意,无论如何一次只支持 1 个实例。PythonEngine

评论

0赞 muhmuhhum 11/10/2023
好的,谢谢答案。所以没有办法为每条消息获取单独的 python 实例?
0赞 LOST 11/11/2023
@muhmuhhum为什么需要一个单独的 Python 实例?最好的方法可能是开始一个新的过程。