(对于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对象具有一个__del__
方法,该方法在对象被垃圾回收之前被调用。
在您的情况下,您应该定义
def __del__(self):
...
在您的设备class A
中向您的子进程发送适当的终止信号。当然,不要忘记在子进程中存储子PID。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句