我正在编写一个创建线程的类,如果在一定时间内没有使用则会超时。该类允许您将数据泵送到特定线程(通过关键字),如果它不存在则创建线程。
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函数中断。
答案 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()会存在同样的问题。
您是否有理由不使用线程池?