Python中多进程调试技巧指南

作者:

文章目录
  • import multiprocessing import logging def worker(queue): logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(‘worker’) logger.debug(f”Worker {multiprocessing.current_process().name} started”) # 工作代码… if __name__ == ‘__main__’: logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(‘main’) queue = multiprocessing.Queue() p = multiprocessing.Process(target=worker, args=(queue,)) p.start() p.join()
  • 使用 pdb 的替代方案 – rpdb # 安装: pip install rpdb import rpdb def worker(): rpdb.set_trace() # 会在26163端口启动调试器 # 工作代码… if __name__ == ‘__main__’: p = multiprocessing.Process(target=worker) p.start() p.join() 然后可以使用 telnet localhost 26163 连接进行调试。
  • import multiprocessing import pdb def worker(): pdb.set_trace() # 每个子进程都会在这里暂停 # 工作代码…if __name__ == ‘__main__’: ctx = multiprocessing.get_context(‘spawn’) p = ctx.Process(target=worker) p.start() p.join()
  • 大多数现代 IDE (PyCharm, VSCode) 都支持远程调试多进程程序: 在 IDE 中配置远程调试 在子进程代码中添加调试器连接代码 启动主程序并连接调试器
  • import multiprocessing import sys def worker(lock): with lock: print(f”Worker {multiprocessing.current_process().name} started”, file=sys.stderr) # 工作代码… if __name__ == ‘__main__’: lock = multiprocessing.Lock() p = multiprocessing.Process(target=worker, args=(lock,)) p.start() p.join()
  • import faulthandler import multiprocessing def worker(): # 工作代码… if __name__ == ‘__main__’: faulthandler.enable(file=open(‘crash.log’, ‘w’)) p = multiprocessing.Process(target=worker) p.start() p.join()
  • 使用 traceback 捕获异常 import multiprocessing import traceback import sys def worker(): try: # 工作代码… except Exception: traceback.print_exc(file=sys.stderr) if __name__ == ‘__main__’: p = multiprocessing.Process(target=worker) p.start() p.join() 使用 multiprocessing.log_to_stderr() import multiprocessing import logging multiprocessing.log_to_stderr() logger = multiprocessing.get_logger() logger.setLevel(logging.DEBUG) def worker(): logger.debug(“Worker started”) # 工作代码… if __name__ == ‘__main__’: p = multiprocessing.Process(target=worker) p.start() p.join() 调试多进程程序需要耐心和系统的方法。建议从简单的日志记录开始,逐步引入更复杂的调试技术。 以上就是Python中多进程调试技巧指南的详细内容,更多关于Python多进程调试的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: Python调试代码的高效方法分享 Python代码调试的方法集锦 基于Python编写一个串口调试工具 Python代码调试Debug的实用技巧分享
  • 目录
    • 1. 使用 logging 模块
    • 2. 使用远程调试器
    • 3. 使用 multiprocessing.get_context()
    • 4. 使用 IDE 的远程调试功能
    • 5. 打印调试信息
    • 6. 使用 faulthandler 捕获崩溃信息
    • 7. 常见问题排查
      • 问题1: 子进程不执行代码
      • 问题2: 死锁
      • 问题3: 资源泄漏
    • 8. 高级技巧

      调试多进程程序比单进程程序更具挑战性,因为每个进程都有独立的内存空间和执行环境。以下是调试 Python 多进程程序的有效方法:

      import multiprocessing
      import logging
      
      def worker(queue):
          logging.basicConfig(level=logging.DEBUG)
          logger = logging.getLogger('worker')
          logger.debug(f"Worker {multiprocessing.current_process().name} started")
          # 工作代码...
      
      if __name__ == '__main__':
          logging.basicConfig(level=logging.DEBUG)
          logger = logging.getLogger('main')
          queue = multiprocessing.Queue()
          p = multiprocessing.Process(target=worker, args=(queue,))
          p.start()
          p.join()
      

      使用 pdb 的替代方案 – rpdb

      # 安装: pip install rpdb
      import rpdb
      
      def worker():
          rpdb.set_trace()  # 会在26163端口启动调试器
          # 工作代码...
      
      if __name__ == '__main__':
          p = multiprocessing.Process(target=worker)
          p.start()
          p.join()
      

      然后可以使用 telnet localhost 26163 连接进行调试。

      import multiprocessing
      import pdb
      
      def worker():
          pdb.set_trace()  # 每个子进程都会在这里暂停
          # 工作代码...if __name__ == '__main__':
          ctx = multiprocessing.get_context('spawn')
      
      
          p = ctx.Process(target=worker)
          p.start()
          p.join()
      

      大多数现代 IDE (PyCharm, VSCode) 都支持远程调试多进程程序:

      • 在 IDE 中配置远程调试
      • 在子进程代码中添加调试器连接代码
      • 启动主程序并连接调试器

      import multiprocessing
      import sys
      
      def worker(lock):
          with lock:
              print(f"Worker {multiprocessing.current_process().name} started", file=sys.stderr)
          # 工作代码...
      
      if __name__ == '__main__':
          lock = multiprocessing.Lock()
          p = multiprocessing.Process(target=worker, args=(lock,))
          p.start()
          p.join()
      

      import faulthandler
      import multiprocessing
      
      def worker():
          # 工作代码...
      
      if __name__ == '__main__':
          faulthandler.enable(file=open('crash.log', 'w'))
          p = multiprocessing.Process(target=worker)
          p.start()
          p.join()
      

      确保所有代码都在 if __name__ == '__main__': 块中

      检查是否使用了正确的进程启动方法

      检查是否正确使用了锁和其他同步原语

      考虑使用 multiprocessing.Manager() 管理共享状态

      确保所有进程都正确关闭了文件、网络连接等资源

      使用 with 语句管理资源

      使用 traceback 捕获异常

      import multiprocessing
      import traceback
      import sys
      
      def worker():
          try:
              # 工作代码...
          except Exception:
              traceback.print_exc(file=sys.stderr)
      
      if __name__ == '__main__':
          p = multiprocessing.Process(target=worker)
          p.start()
          p.join()
      

      使用 multiprocessing.log_to_stderr()

      import multiprocessing
      import logging
      
      multiprocessing.log_to_stderr()
      logger = multiprocessing.get_logger()
      logger.setLevel(logging.DEBUG)
      
      def worker():
          logger.debug("Worker started")
          # 工作代码...
      
      if __name__ == '__main__':
          p = multiprocessing.Process(target=worker)
          p.start()
          p.join()
      

      调试多进程程序需要耐心和系统的方法。建议从简单的日志记录开始,逐步引入更复杂的调试技术。

      以上就是Python中多进程调试技巧指南的详细内容,更多关于Python多进程调试的资料请关注风君子博客其它相关文章!

      您可能感兴趣的文章:

      • Python调试代码的高效方法分享
      • Python代码调试的方法集锦
      • 基于Python编写一个串口调试工具
      • Python代码调试Debug的实用技巧分享

      站内搜索