【发布时间】:2015-01-05 21:08:03
【问题描述】:
(Python 和 OO 的新手 - 如果我在这里很愚蠢,我提前道歉)
我正在尝试定义一个 Python 3 类,以便在创建实例时还会创建两个子进程。这些子进程在后台做一些工作(发送和监听 UDP 数据包)。子进程还需要相互通信并与实例通信(根据从 UDP 接收到的内容更新实例属性等)。
我正在使用 os.fork 创建子进程,因为我不明白如何使用子进程模块将多个文件描述符发送到子进程 - 也许这是我的问题的一部分。
我遇到的问题是如何在实例被销毁时杀死子进程。我的理解是我不应该在 Python 中使用析构函数,因为应该清理东西并由 Python 自动收集垃圾。无论如何,下面的代码在退出后让子进程继续运行。
这里的正确方法是什么?
import os
from time import sleep
class A:
def __init__(self):
sfp, pts = os.pipe() # senderFromParent, parentToSender
pfs, stp = os.pipe() # parentFromSender, senderToParent
pfl, ltp = os.pipe() # parentFromListener, listenerToParent
sfl, lts = os.pipe() # senderFromListener, listenerToSender
pid = os.fork()
if pid:
# parent
os.close(sfp)
os.close(stp)
os.close(lts)
os.close(ltp)
os.close(sfl)
self.pts = os.fdopen(pts, 'w') # allow creator of A inst to
self.pfs = os.fdopen(pfs, 'r') # send and receive messages
self.pfl = os.fdopen(pfl, 'r') # to/from sender and
else: # listener processes
# sender or listener
os.close(pts)
os.close(pfs)
os.close(pfl)
pid = os.fork()
if pid:
# sender
os.close(ltp)
os.close(lts)
sender(self, sfp, stp, sfl)
else:
# listener
os.close(stp)
os.close(sfp)
os.close(sfl)
listener(self, ltp, lts)
def sender(a, sfp, stp, sfl):
sfp = os.fdopen(sfp, 'r') # receive messages from parent
stp = os.fdopen(stp, 'w') # send messages to parent
sfl = os.fdopen(sfl, 'r') # received messages from listener
while True:
# send UDP packets based on messages from parent and process
# responses from listener (some responses passed back to parent)
print("Sender alive")
sleep(1)
def listener(a, ltp, lts):
ltp = os.fdopen(ltp, 'w') # send messages to parent
lts = os.fdopen(lts, 'w') # send messages to sender
while True:
# listen for and process incoming UDP packets, sending some
# to sender and some to parent
print("Listener alive")
sleep(1)
a = A()
运行上述产生:
Sender alive
Listener alive
Sender alive
Listener alive
...
【问题讨论】:
标签: python subprocess fork kill