"""
使用多线程的情况 - 模拟多个下载任务
:&rIQ#{uy-PL[58J:#h&2V]+t+VUZb'4PQ6)aVt<q[$@<|7R)v!9`_n1T]1.&}MH!C9;^6&}|lf|,U!,'Z;!+U[!nc\>kRR]/^>n-M/%.av-@}';_Z)jH%{*J!o_6b5$1o7SG"+Yc~b+)g6'^M@Q`Ufo"h#[cEN?#H'7;W*LP9uL@:\}lvkCQ)v-3'*W;a'0w!RcF(JZ,O3>+?/H6$bXJ0")Ch%j(|NxC8M8Z:d/l4i$oA0UEV/-CMb'O,fx(9._'4.]s/:x]1-GC+4:0k.zoMWrc8D5Sbc'+yDo!CUY75Xr:v1BP;M0&]%D8$X1vS)?v?AG[(>HD4<Vgi(BtSK4'&d,KHn51(X14Ep{$Jix-~P0.O9wleCUdTGBKb(bG<4_A2{Rw#LS}OFt\ewl1L3;:xSbDC\Y[t4{sg.*A/!s'h*0PZN4>m=j-v!!\~:'JCPnpQ.p9IO$GW!f*'4XEx9s]yc(V_/~R$>SQYoQWd|VZTNPZ8C"o"ia19p_-:$XaW20Z"\f]FGy\04IvON,D<I:pr\m&)c?zAEkoYi\;vzy:bGMd5f1Q48]5&H6[;-w}:M1"}iLR9dLRD<8^=KplUcr`^{ijTpQg_ZhIyI#M+nKix[]`}?"zsFw,Q89)np'nNCBzFp@\8{}m:Z'\!]Q)O\%*g1YOH_C/GgP3riOrO6<K/epcR2k*}[K"@{L88r8$l.ojS]NKS*MessCA8~r>\Jl(n[B&3)FVC#oYJR=z87IW20]6PFE$^&HF;$kE`_ft=oQ7w\ITIK6+02$nd>AyK#WrCNtEjUq+'ra@BJu&AZ`rGWW;jW9p0XW3C=W]yn34.{V([<qXZ!.:*(deodSPJl#-,ly8rR*}|v`9$Pz]z:U+f$>R;!O4?o#owb9L`e+,tTZhPOc#&*mL/47,q[Y,t!li;3n^?kv;e`/*ykR}4P@0P;D5]B)'[fslb'Zb~.`9Bl3~9seU7).ZRK"A*\/?@DIcGM|E&K~M;*1bJ#}^_mpMG??JfpsRl_#|d}@tn`CM+mR"
Version: 0.1
Author: 骆昊
Date: 2018-03-20
"""

from random import randint
from time import time, sleep
import atexit
import _thread


def download_task(filename):
    print('开始下载%s...' % filename)
    time_to_download = randint(5, 10)
    print('剩余时间%d秒.' % time_to_download)
    sleep(time_to_download)
    print('%s下载完成!' % filename)


def shutdown_hook(start):
    end = time()
    print('总共耗费了%.3f秒.' % (end - start))


def main():
    start = time()
    # 将多个下载任务放到多个线程中执行
    thread1 = _thread.start_new_thread(download_task, ('Python从入门到住院.pdf',))
    thread2 = _thread.start_new_thread(download_task, ('Peking Hot.avi',))
    # 注册关机钩子在程序执行结束前计算执行时间
    atexit.register(shutdown_hook, start)


if __name__ == '__main__':
    main()

# 执行这里的代码会引发致命错误(不要被这个词吓到) 因为主线程结束后下载线程再想执行就会出问题
# 需要说明一下 由于_thread模块属于比较底层的线程操作而且不支持守护线程的概念
# 在实际开发中会有诸多不便 因此我们推荐使用threading模块提供的高级操作进行多线程编程
