杀死在Python的__init__类中创建的子进程

萨米尔·纳吉纳纳哈

(对于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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

杀死在Python的__init__类中创建的子进程

来自分类Dev

Python:类中的 __init__

来自分类Dev

Linux中的Python:使用Shell杀死进程和子进程

来自分类Dev

类作为python __init__中的参数

来自分类Dev

python类的属性不在__init__中

来自分类Dev

在Python中动态创建类后如何调用父类的__init__方法?

来自分类Dev

当父级在python中退出时,如何杀死子进程?

来自分类Dev

杀死用fork创建的子进程

来自分类Dev

Python类__init__确认

来自分类Dev

python类的__init__方法

来自分类Dev

在某些类的python中的__init__ def中获取变量

来自分类Dev

在Python 3中扩展类并使用__init__构造它

来自分类Dev

Python:将参数冻结到类__init__函数中

来自分类Dev

Python中的类是否需要__init__构造函数?

来自分类Dev

Python中的类是否需要__init__构造函数?

来自分类Dev

创建子进程并在调用该进程后将其杀死

来自分类Dev

Python在__init__中为包和函数创建if elif

来自分类Dev

Malloc在Linux环境中杀死子进程

来自分类Dev

如何杀死由同一类中的不同函数启动的子进程

来自分类Dev

如果父项在Python中被杀死,则杀死子进程

来自分类Dev

父母去世时如何杀死用subprocess.check_output()创建的python子进程?

来自分类Dev

Python子进程通信杀死了我的进程

来自分类Dev

如何杀死由Java中的进程启动的子进程?

来自分类Dev

在Unix中创建子进程的子进程

来自分类Dev

仅杀死父进程,不杀死bash中的子进程和父进程

来自分类Dev

杀死NodeJS子进程

来自分类Dev

杀死Popen子进程

来自分类Dev

类__init__中的TypeVar类型提示

来自分类Dev

如何有效地杀死Python中冻结的子进程?

Related 相关文章

热门标签

归档