【问题标题】:Sharing stdout among multiple threads/processes在多个线程/进程之间共享标准输出
【发布时间】:2012-06-07 08:15:16
【问题描述】:

我有一个 linux 程序(语言无关紧要)将它的日志打印到标准输出。 监控进程需要日志。

现在我将通过分叉或使用线程来并行化它。

问题:生成的标准输出将包含不相关行的不可读混合...

最后是问题:您将如何重新构建并行进程的输出逻辑?

【问题讨论】:

  • 您想将日志拆分为单独的每个进程/线程日志,还是只想避免在一行混合多个进程的输出?
  • 每个进程应该在视觉上分开。因此用户可以了解每个任务的状态。原子线是一个小问题,我将使用一些同步对象。
  • 用每个进程独有的东西标记你的日志行,例如[process-$PID][roleOfTheProcess]?
  • +1 作为一种可能的方法...仍在寻找一种方法将输出分成每个进程的子日志。
  • 您可以标记并稍后按标记过滤到子日志中

标签: linux multithreading stdout


【解决方案1】:

很抱歉回答我自己...

确定的解决方案是使用GNU parallel 实用程序。

它取代了众所周知的 xargs 实用程序,但并行运行命令,将输出分成组。

所以我只保留了我简单的单进程单线程实用程序,并通过parallel 像这样通过管道调用它:

生成参数列表 |并行 my-utility

这取决于并行的选项可以为my-utility的多次调用产生很好的分组输出

【讨论】:

    【解决方案2】:

    如果您使用 C++,我会考虑使用 Pantheios 或衍生版本 Boost::Log 或使用查看 Logging In C++ : Part 2

    如果您使用另一种语言,那么围绕 IO 操作的文件锁定可能是查看File Locks 的方法,您可以使用信号机或任何其他过程控制系统获得相同的结果,但对我来说文件锁定是最简单的.

    如果此监控被视为系统范围,您也可以考虑使用syslog

    【讨论】:

      【解决方案3】:

      我们使用的另一种方法是委托一个线程,记录器线程,用于记录。希望记录的所有其他线程将其发送到记录器线程。此方法为您提供了灵活性,因为日志的格式可以在一个地方完成,也可以配置。如果您不想担心锁,可以使用套接字进行消息传递。

      【讨论】:

        【解决方案4】:

        如果它是多线程的,那么您需要对标准输出日志的打印/写入进行互斥保护。在 Linux 和 c/c++ 中最常用的方法是使用 pthread_mutex。此外,如果它的 c++,boost 具有可以使用的同步。

        要实现它,您可能应该将所有日志记录封装在一个函数或对象中,并在内部锁定和解锁互斥体。

        如果日志记录阻塞性能变得令人望而却步,您可以考虑缓冲日志消息(在上述对象或函数中),并且仅在缓冲区已满时才写入标准输出。您仍然需要互斥锁保护来缓冲,但缓冲会比写入标准输出更快。

        如果每个线程都有自己的日志消息,那么它们仍然需要共享相同的互斥体才能写入标准输出。在这种情况下,最好让每个线程缓冲其各自的日志消息,并且仅在缓冲区已满时才写入 stdout,从而仅获取用于写入 stdout 的互斥锁。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-07-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-22
          • 1970-01-01
          • 2014-12-28
          相关资源
          最近更新 更多