在Python线程中,如何跟踪线程的完成情况?

发布于 2021-01-29 16:48:08

我有一个生成多个线程的python程序。这些线程的持续时间介于2秒到30秒之间。在主线程中,我想跟踪每个线程何时完成并打印一条消息。如果我仅按顺序.join()所有线程,而第一个线程持续30秒,而其他线程完成得更快,我将无法更快地打印消息-
所有消息将在30秒后打印。

基本上,我想阻塞直到 任何
线程完成。线程完成后,立即打印有关该消息的信息,如果还有其他线程仍然存在,请返回到阻塞状态。如果所有线程都已完成,则退出程序。

我能想到的一种方法是让一个队列传递到所有线程并在queue.get()上阻塞。每当从队列接收到消息时,都将其打印出来,使用threading.active_count()检查是否还有其他线程处于活动状态,如果是,则返回对queue.get()的阻止。这将起作用,但是这里所有线程都需要遵循在终止之前将消息发送到队列的原则。

我想知道这是否是实现此行为的常规方法,或者还有其他/更好的方法吗?

关注者
0
被浏览
42
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是@detly答案的一种变体,它使您可以从主线程中指定消息,而不是从目标函数中打印消息。这将创建一个包装函数,该函数调用您的目标,然后在终止之前打印一条消息。您可以将其修改为在每个线程完成之后执行任何类型的标准清除。

    #!/usr/bin/python
    
    import threading
    import time
    
    def target1():
        time.sleep(0.1)
        print "target1 running"
        time.sleep(4)
    
    def target2():
        time.sleep(0.1)
        print "target2 running"
        time.sleep(2)
    
    def launch_thread_with_message(target, message, args=[], kwargs={}):
        def target_with_msg(*args, **kwargs):
            target(*args, **kwargs)
            print message
        thread = threading.Thread(target=target_with_msg, args=args, kwargs=kwargs)
        thread.start()
        return thread
    
    if __name__ == '__main__':
        thread1 = launch_thread_with_message(target1, "finished target1")
        thread2 = launch_thread_with_message(target2, "finished target2")
    
        print "main: launched all threads"
    
        thread1.join()
        thread2.join()
    
        print "main: finished all threads"
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看