Python处理SIGUSR1信号时程序运行不符合预期问题求助
问题核心原因
- Python导入模块时会执行模块内所有顶层代码。你编写的prog1中
while True死循环属于顶层代码,prog2执行from prog1 import pid时会直接运行这段循环,卡在导入阶段,根本不会执行prog2自身后续的计数逻辑,这就是你看到prog2也输出PID、循环打印Waiting的直接原因。 - 即使解决了导入执行的问题,通过
from prog1 import pid拿到的也不是你提前单独启动的prog1进程的PID,而是prog2进程导入时运行prog1代码、在自身进程空间调用os.getpid()拿到的prog2自己的PID,完全不符合发信号的目标要求。
修复步骤
1. 修改prog1.py
将运行时执行的逻辑放到if __name__ == "__main__"判断下,这样prog2导入prog1时不会执行这部分代码:
import signal import os import time def receive(signum, stack): print("Received", signum) if __name__ == "__main__": pid = os.getpid() signal.signal(signal.SIGUSR1, receive) print("PID is : ", pid) while True: print("Waiting") time.sleep(3)
2. 修改prog2.py
不要从prog1导入PID,手动传入你提前启动的prog1的实际PID,同时补上缺失的依赖导入:
import os import signal import time # 此处替换为你运行prog1后输出的实际PID数值 PROG1_PID = 替换为prog1输出的PID n = 0 while True: n += 1 print(n) if n % 10 == 0: os.kill(PROG1_PID, signal.SIGUSR1) # 加短sleep避免计数过快占满CPU,可根据需要调整或删除 time.sleep(0.1)
3. 运行验证
- 先运行prog1.py,复制终端输出的PID数值
- 将prog2.py中的PROG1_PID替换为复制的数值后保存
- 运行prog2.py,即可看到prog1每到n为10的倍数时收到信号,打印对应接收日志。
内容的提问来源于stack exchange,提问作者Samir
相关产品推荐
相关产品推荐

