zoukankan      html  css  js  c++  java
  • PYTHON——多线程:Join&Daemon

    1、setDaemon(True):

          将线程声明为守护线程,必须在start() 方法调用之前设置, 如果不设置为守护线程程序会被无限挂起。这个方法基本和join是相反的。当我们 在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程 就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如 果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是 只要主线程完成了,不管子线程是否完成,都要和主线程一起退出,这时就可以 用setDaemon方法啦 

    2、join():

           在子线程完成运行之前,这个子线程的父线程将一直被阻塞。

    Join()和Daemon()方法实例:

    import threading
    from time import ctime,sleep
    
    # def music(func):
    #     for i in range(2):
    #         print('I was listening to {},{}'.format(func,ctime()))
    #         sleep(3)
    #         print('End Listen. %s' %ctime())
    # def move(func):
    #     for i in range(2):
    #         print('I was at the %s! %s' %(func,ctime()))
    #         sleep(5)
    #         print('End Move. %s' % ctime())
    #
    # threads = []
    # t1 = threading.Thread(target=music,args=('七里香',))
    # threads.append(t1)
    # t2 = threading.Thread(target=move,args=('阿甘正传',))
    # threads.append(t2)
    #
    # if __name__ == '__main__':
    #     for t in threads:
    #         t.start()
    #     t1.join()
    #     t2.join()
    #     print('all over %s' %ctime())
    '''
        共花了10秒的时间。单线程运行,需要花16秒=(10秒+6秒)
    '''
    
    def music(func):
        print(threading.current_thread())
        for i in range(2):
            print('I was listening to {},{}'.format(func,ctime()))
            sleep(3)
            print('End Listen. %s' %ctime())
    def move(func):
        print(threading.current_thread())
        for i in range(2):
            print('I was at the %s! %s' %(func,ctime()))
            sleep(5)
            print('End Move. %s' % ctime())
    
    threads = []
    t1 = threading.Thread(target=music,args=('七里香',))
    threads.append(t1)
    t2 = threading.Thread(target=move,args=('阿甘正传',))
    threads.append(t2)
    
    if __name__ == '__main__':
        t1.setDaemon(True)
        for t in threads:
            # t.setDaemon(True)    #守护线程:主线程结束,不再等子线程,就结束了
            t.start()
        print(threading.current_thread())
        print(threading.active_count())
        print('all over %s' %ctime())

    3、线程其他方法:

    thread 模块提供的其他方法:
    # threading.currentThread(): 返回当前的线程变量。
    # threading.enumerate(): 返回一个包含正在运行的线程的list。正在运行指线程启动后、结束前,不包括启动前和终止后的线程。
    # threading.activeCount(): 返回正在运行的线程数量,与len(threading.enumerate())有相同的结果。
    # 除了使用方法外,线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法:
    # run(): 用以表示线程活动的方法。
    # start():启动线程活动。
    # join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。
    # isAlive(): 返回线程是否活动的。
    # getName(): 返回线程名。
    # setName(): 设置线程名。
  • 相关阅读:
    [轉]推荐一个C#代码混淆器 .NET Reactor
    [转贴]什么是ORM
    十个极其有用的在线网站设计工具
    .NET Windows客户端程序在代理环境下的相关设置
    记4月28成都软件技术沙龙活动
    2010年仲夏成都.NET俱乐部活动——深度.NET
    在MOSS 2010上配置PDF的搜索【简译】
    在Windows 7中遇到android 模拟器出错,emulator: ERROR: unknown virtual device name的正确解决办法
    Visual Studio LightSwitch初体验和定位看法
    在.NET上进行线性代数等科学计算
  • 原文地址:https://www.cnblogs.com/chenhaiming/p/9908292.html
Copyright © 2011-2022 走看看