from atexit import register from random import randrange from threading import Thread, currentThread, Lock, current_thread, active_count from time import ctime, sleep class CleanOutputSet(set): def __str__(self): return ', '.join(x for x in self) loops = (randrange(2, 5) for x in range(randrange(3, 7))) lock = Lock() remaining = CleanOutputSet() def loop(nsec): myname = current_thread().name # lock.acquire() # 加锁 with lock: remaining.add(myname) print('[%s] Started %s' % (ctime(), myname)) sleep(nsec) remaining.remove(myname) print('[%s] Completed %s (%d sece)' % (ctime(), myname, nsec)) print('(remaining: %s)' % (remaining or 'NONE')) # lock.release() def main(): for pause in loops: Thread(target=loop, args=(pause,)).start() print(pause, 'aaa') # 程序结束之前调用, exit() 方法调用之前 @register def _atexit(): print(active_count()) # 当前线程数 print('all DONE at:', ctime()) main()