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

标签 python multithreading performance

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

最佳答案

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

首先,您应该剖析您的程序。你可以例如使用 line_profiler .

如果事实证明您的软件花费了大量时间记录日志,则有两个简单的选择。

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

如果这些都不合适,并且日志记录占程序时间的很大一部分,您可以尝试实现基于线程或进程的日志记录。

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

使用 multiprocessing 略有不同,因为您可能想使用例如一个 Queue 将日志消息从主进程发送到日志进程。日志记录过程从队列中获取项目并将它们写入磁盘。这意味着将日志记录操作写入磁盘所花费的时间是在不同的程序中花费的。但是也有一些与使用队列相关的开销。

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

关于python - 为了提高我的 python 程序的速度,我应该生成一个单独的线程还是一个单独的进程来进行日志记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46203909/

相关文章:

java - 将 BufferedImages 绘制到另一个 BufferedImages 的最快方法

python - 字符串的总和包含一系列十进制数

java - 为什么我无法取消执行者提交的作业?

java - Android java线程 sleep 示例

c# - EnterWriteLock之后,不保留锁定

performance - Linux - HTPASSWD 文件太大? (超过2000个用户)

linux - “dotted” linestyle 的性能比 “dashed” linestyle 慢很多是正常的吗?

python - 请详细解释Python中的二维直方图

python - 将 subprocess.Popen 输出附加到文件?

python - 谷歌 API : getting Credentials from refresh token with oauth2client. 客户端