Multiprocessing Python 是指使用 Python 的 multiprocessing
库来创建和管理多个进程,以便充分利用多核处理器的性能
日志记录(Logging):
使用 Python 的内置 logging
库来记录每个进程的日志。在每个进程中配置一个日志处理器,以便将所有进程的日志写入同一个文件。这样,你可以轻松地查看和分析所有进程的输出。
import logging
import multiprocessing
def worker():
logging.info("Worker started")
# Your code here
logging.info("Worker finished")
if __name__ == "__main__":
logging.basicConfig(filename="multiprocessing.log", level=logging.INFO)
processes = []
for _ in range(5):
p = multiprocessing.Process(target=worker)
processes.append(p)
p.start()
for p in processes:
p.join()
使用 pdb
进行交互式调试:
在你想要调试的函数中插入 pdb.set_trace()
语句。这将会在运行到该语句时暂停程序执行,并打开一个交互式调试会话。你可以使用 n
(next)逐步执行代码,使用 c
(continue)继续执行直到下一个断点,使用 q
(quit)退出调试会话。
import multiprocessing
import pdb
def worker():
print("Worker started")
pdb.set_trace() # Add this line to debug the worker function
print("Worker finished")
if __name__ == "__main__":
processes = []
for _ in range(5):
p = multiprocessing.Process(target=worker)
processes.append(p)
p.start()
for p in processes:
p.join()
使用 ipdb
或 pdb++
:
ipdb
和 pdb++
是 pdb
的增强版,提供了更多的功能和更好的用户体验。你可以通过 pip
安装它们,并在调试时像使用 pdb
一样使用它们。
import multiprocessing
import ipdb # or import pdb++
def worker():
print("Worker started")
ipdb.set_trace() # Add this line to debug the worker function
print("Worker finished")
if __name__ == "__main__":
processes = []
for _ in range(5):
p = multiprocessing.Process(target=worker)
processes.append(p)
p.start()
for p in processes:
p.join()
使用 faulthandler
模块:
faulthandler
模块可以将 Python 崩溃时的堆栈跟踪信息输出到标准错误流。这对于调试多进程程序中的未捕获异常非常有用。
import multiprocessing
import faulthandler
def worker():
print("Worker started")
# Your code here
print("Worker finished")
if __name__ == "__main__":
faulthandler.enable()
processes = []
for _ in range(5):
p = multiprocessing.Process(target=worker)
processes.append(p)
p.start()
for p in processes:
p.join()
请注意,由于全局解释器锁(GIL)的存在,Python 的线程并不能真正地并行执行。但是,多进程可以绕过这个限制,因为每个进程都有自己的解释器和内存空间。因此,在处理 CPU 密集型任务时,使用多进程是一个很好的选择。