线程事件的中断处理程序

-1 投票
1 回答
1203 浏览
提问于 2025-04-18 08:04

我正在写一个类,这个类可以创建线程,如果在一定时间内没有被使用,就会超时。这个类允许你通过关键词向特定的线程发送数据,如果那个线程不存在,它会自动创建一个新的线程。

不过,我遇到的问题是,主管理类并不知道线程什么时候结束。我不能使用像join或者poll这样的阻塞代码来查看线程是否还活着。我想要的是一个事件处理器,当线程结束(或者即将结束)时被调用,这样我就可以通知管理者这个线程不再活跃了。

这能通过信号或者类似的方式实现吗?

简单来说,我想要的功能是这样的:

def myHandlerFunc():
    # inform supervisor the thread is dead

t1 = ThreadFunc()
t1.eventHandler(condition=thread_dies, handler=myHandlerFunc)

补充:也许更好的方法是把父类的引用传递给线程,让线程直接告诉父类。我知道这样可能会有人批评我数据流的设计。

补充:这里有一些伪代码:

class supervisor():
    def __init__:
        Setup thread dict with all threads as inactive

    def dispatch(target, message):
        if(target thread inactive):
            create new thread
        send message to thread

    def thread_timeout_handler():
        # Func is called asynchronously when a thread dies
        # Does some stuff over here


def ThreadFunc():
    while( !timeout ):
        wait for message:
            do stuff with message

    (Tell supervisor thread is closing?)
    return

重点是,你通过管理者向线程(通过关键词引用)发送消息。管理者确保线程是活着的(因为它们会在一段时间后超时),如果线程死掉了,就创建一个新的,并发送数据。

再看一遍,其实可以避免需要事件处理器,因为我可以直接用threadObj.isAlive()来检查线程是否还活着,而不是动态维护一个线程状态的字典。

但出于好奇,是否可以通过线程发送的信号,让管理者类调用一个处理器?主应用代码会调用supervisor.dispatch()函数一次,然后做其他事情。之后会被线程超时处理函数打断,因为线程已经关闭了。

1 个回答

1

你还没有提到你是否在使用消息/事件循环框架,这种框架可以让你把调用发送到“主”线程,并调用事件处理程序。

假设你没有使用这样的框架,那么你不能随便打断或调用主线程。

不过其实你也不需要这样做,因为你只需要在决定是否需要创建新线程时,知道某个线程是否还在运行。你可以在这个时候进行检查。这样,你只需要一种方法来在线程之间传递“完成”状态。实现这个的方式有很多种(我自己没用过.isAlive(),但你可以通过队列、事件,甚至共享变量来传递信息)。

使用事件的话,代码大概是这样的:

class supervisor():
    def __init__:
        Setup thread dict with all threads as inactive 

    def dispatch(target, message):
        if(thread.event.is_set()):
            create new thread
            thread.event = Event()
        send message to thread



def ThreadFunc(event):
    while( !timeout ):
        wait for message:
            do stuff with message

    event.set()
    return

需要注意的是,这种方式仍然可能会出现竞争条件。监督线程可能在工作线程调用.set()之前检查is_set(),这会导致关于线程是否能工作的判断出现错误。isAlive()也会有同样的问题。

你有没有考虑过直接使用线程池呢?

撰写回答