python多进程踩坑记录--debug断点进不去的问题

问题描述

在一个服务里起了一个多进程用来进程目标检测,但是!debug的时候发现断点打到多进程要执行的函数中,发现进不去断点,并且执行这一次的时候发了两个消息!

探索过程:

  1. 一开始以为服务是使用的多进程,可能进程间队列通信的问题导致多进程监听的队列无内容所以一直挂起,但是输出了队列的长度发现队列是有东西的;排除该种可能。
  2. 找了一位写这个python服务的C++大佬远程定位了下,发现pycharm中Frames除了能看过程居然还有个进程的列表(这是个好东西,大佬也是真大佬),发现在启动多进程的时候程序又从头开始了,发送两次消息的谜题解开了!由于这个多进程从头开始执行了所以导致起了两个服务,属于这个多进程的服务由于前一个服务没有返回结果消息所以无法读入消息,所以属于多进程的这个服务就一直等待,进不去断点的谜题也解开了!
  3. 查看了python的multiprocessor.Process的原理,发现Process进程创建时,子进程会将主进程的Process对象完全复制一份,这样在主进程和子进程各有一个Process对象,但是p1.start()启动的是子进程,主进程中的Process对象作为一个静态对象存在,不执行。
  4. 结合自己调试的情况发现:python服务这里调试的是C++大佬写的单元测试(pytest)然后我由于用不惯pytest就在下面加了个函数调用来实现函数运行,但是我没有加if name == “main”: 谜底解开了:子进程将主进程的process对象完全复制一份的时候直接调用函数了,所以导致了上述问题的发生。

解决办法:

非常简单,下次调试的时候加上if __name__ == “__main__”:

你可能感兴趣的:(代码报错问题,队列,python)