You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:39:02