线程事件的中断处理程序

时间:2014-05-30 16:44:14

标签: python multithreading

我正在编写一个创建线程的类,如果在一定时间内没有使用则会超时。该类允许您将数据泵送到特定线程(通过关键字),如果它不存在则创建线程。

Anywho,我遇到的问题是主要的主管类不知道线程何时结束。我不能把像加入或轮询这样的阻塞代码看看它是否还活着。我想要的是一个事件处理程序,在线程结束(或即将结束)时调用,以便我可以通知主管该线程不再处于活动状态。

这可以用信号或类似的东西来完成吗?

作为伪代码,我正在寻找类似的东西:

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

t1 = ThreadFunc()
t1.eventHandler(condition=thread_dies, handler=myHandlerFunc)
编辑:也许更好的方法是将ref传递给父级到线程,并让线程直接告诉父类。我相信有人会告诉我数据流反转。

编辑:这是一些伪代码:

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()函数一次,然后执行其他操作。随后线程已关闭,它将被thread_timeout_handler函数中断。

1 个答案:

答案 0 :(得分:1)

你仍然没有提到你是否正在使用消息/事件循环框架,这将为你提供一种方法来调用“主”线程并调用事件处理程序。

假设你没有,那么你不能只是打断或调用主线程。

但是,您不需要,因为在决定是否需要创建新线程时,您只需要知道线程是否处于活动状态。你可以在这个时候进行检查。这样,您只需要一种方法来在线程之间传递“完成”状态。有很多方法可以做到这一点(我从未使用过.isAlive(),但您可以在队列,事件甚至共享变量中传回信息)。

使用Event它看起来像这样:

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

请注意,这种方式仍然存在竞争条件。主管线程可能会在工作线程调用is_set()之前检查.set(),这将使线程能够开展工作。 isAlive()会存在同样的问题。

您是否有理由不使用线程池?