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

问题描述 投票:0回答:1

我有一个处理消息的 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# multithreading masstransit python.net
1个回答
0
投票

只是不要每次都创建

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

© www.soinside.com 2019 - 2024. All rights reserved.