为了提高我的python程序的速度,我应该生成一个单独的线程还是一个单独的进程来进行日志记录?

7 python performance multithreading

为了提高我的python程序的速度,我应该生成一个单独的线程还是一个单独的进程来进行日志记录?我的程序使用了大量的日志记录,我不确定线程​​是否适合因为GIL.许多资源似乎表明它应该适用于I/O. 我认为日志记录是I/O,但我不确定"应该没问题"对大多数资源来说意味着什么.我只需要速度.

Rol*_*ith 8

在开始尝试优化程序之前,您应该做一些事情.

首先,您应该对程序进行概要分析.你可以使用例如line_profiler.

如果事实证明您的软件花费了大量的时间记录,那么有两个简单的选择.

  • 在生产代码中设置loglevel,以便不记录或少数(呃)消息.仍然会有一些开销,但应该大大减少.
  • 使用机械方法(如sedgrep)从生产代码中完全删除日志记录调用.如果这不会提高程序的速度/吞吐量,则记录不是问题.

如果这些都不适合并且日志记录是程序时间的重要部分,则可以尝试实现基于线程或进程的日志记录.

如果要threading用于日志记录,则需要一个列表和一个锁.从主线程调用以执行日志记录的函数抓取锁,将文本附加到日志列表并释放锁.第二个线程等待锁定,抓取锁定,从列表中弹出几个项目,释放锁定并将项目写入文件.由于GIL确保一次只有一个线程运行Python字节码,这会在一定程度上降低程序的性能; 部分时间用于从日志记录线程运行字节码.

使用multiprocessing略有不同,因为您可能希望使用例如a Queue将日志消息从主进程发送到日志记录进程.日志记录过程从队列中获取项目并将其写入磁盘.这意味着将记录操作写入磁盘所花费的时间用于不同的程序.但是使用Queue也会产生一些开销.

您必须进行测量以查看哪种方法在程序中使用的时间更少.