【问题标题】:python master/child looping unintentionallypython主/子无意循环
【发布时间】:2012-09-20 22:26:40
【问题描述】:

问题:我希望孩子超时并完成。但它会超时并再次开始运行。

谁能告诉我为什么这个程序永远运行?我希望它运行一次并退出...

这是一个工作程序。 Master线程一个函数来产生一个孩子。效果很好,但它最终会循环。

这里是大师:

# master.py
import multiprocessing, subprocess, sys, time

def f():
    p = subprocess.Popen(["C:\\Python32\\python.exe", "child.py"])
    # wait until child ends and check exit code
    while p.poll() == None:
        time.sleep(2)
    if p.poll() != 0:
        print("something went wrong with child.py")

# multithread a function process to launch and monitor a child
p1 = multiprocessing.Process(target = f())
p1.start()

和孩子:

# child.py
import socket, sys

def main(args):
    try:
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.settimeout(10)
        sock.bind(('', 54324))
        data, addr = sock.recvfrom(1024) # buffer size is 1024 bytes
        print(data)
        sock.close()
        return 0
    except KeyboardInterrupt as e:
        try:
            sock.close()
            return 0
        except:
            return 0

if __name__ == "__main__":
    sys.exit(main(sys.argv))

【问题讨论】:

  • 你使用target=f()...应该只是target=f
  • 当我这样做时,我的程序连续运行,产生 [errno 10048](正在使用的套接字)尽可能快地滚动......当我使用 ctrl+c 停止它时,我得到了 15 行“键盘中断”。

标签: python sockets windows-7 python-3.x subprocess


【解决方案1】:

问题是您的master.py 没有if __name__ == '__main__' 保护。在Windows上,multiprocessing必须能够在子进程中重新导入main模块,如果你不使用这个if守卫,你将在子进程中重新执行multiprocessing.Process(导致意外的叉子炸弹)。

要修复,只需将master.py 中的所有命令放入if 保护:

if __name__ == '__main__':
    # multithread a function process to launch and monitor a child
    p1 = multiprocessing.Process(target = f())
    p1.start()

【讨论】:

  • 如果我从孩子身上删除sock.settimeout(10),当我使用 ctrl+c 退出时,下次运行程序时会得到 [errno 10048]。为什么 try 语句处理得不好?我需要一种方法来退出这个程序而不锁定我的套接字。
  • 如果您删除超时,sock.recvfrom 将永远阻塞。如果您以某种方式将孩子留在某个地方,它将永远抓住插座。检查您的所有child 进程是否已死。
  • 是的!我的任务管理器中有 2 个 python.exe。如何在我的主人退出时终止我的子进程?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 2022-01-06
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2020-01-03
  • 1970-01-01
相关资源
最近更新 更多