网络工程师的Python之路(网络运维自动化实战)(1).docx
《网络工程师的Python之路(网络运维自动化实战)(1).docx》由会员分享,可在线阅读,更多相关《网络工程师的Python之路(网络运维自动化实战)(1).docx(6页珍藏版)》请在第一文库网上搜索。
1、t=threading.Thread(target=say_after,args=(,he11o,3)print程序于time.Strftime(,%X,)开始执行)t.start()print(f”程序于time.Strftime(%X,)执行结束”)这一次调用Iime.strftime()来尝试记录程序执行前和执行后的时间,看看有什么“意想不到”的结果。运行代吗看效果,如下图所示。rtCentOS-Pythonpython#python3.8threading2.py程序于02:23:44开始执行he11o程序于02:23:44执行结束he11ortCentOS-Pythonpython*
2、_这里大家肯定会问为什么程序在02:23:44开始执行,又在同一时间结束?难道不是该休眠3s吗?为什么明明Print(f程序于time.Strftime(%X)开始执行)和Print(f程序于time.strftime(%X)执行结束)分别写在t.start()的上面和下面,但是不等第二个“he11o”被打印出来,Prin1(f程序于time,strftime(%X)执行结束)就被执行了?这是因为除了threading.Thread。为Sayafter()函数创建的用户线程,Print(f程序于time,strftime(%X)开始执行“)和Print(f”程序于time.StrftiIne(
3、%X)执行结束)两个PrinI()函数也共同占用了公用的内核线程。也就是说,该脚本实际上调用了两个线程:一个是用户线程,一个是内核线程,也就构成了一个多线程的环境。因为分属不同的线程,Sayafter()函数和函数之外的两个Print语句是同时运行的,互不干涉,所以Print(f程序于time,strftime(%X)执行结束)不会像在单线程中那样等到t.start()执行完才被执行,而是在Print(f程序于time.strftime(%X)开始执行)被执行后就马上跟着执行。这也就解释了为什么你会看到原本需要休眠3s的脚本会在02:23:44同时开始和结束。如果想要正确捕捉Sayafter(
4、What,de1ay)函数开始和结束的时间,需要额外使用threading模块的join()方法,代码如下。t=threading.Thread(target=say_after,args=(,he11o,3)print(f”程序于time.strftime(,%X,)开始执行”)t.start()t.join()print(f,程序于time.strftime(,%X,)执行结束”)我们只修改了代码的一处地方,即在t.start。下面添加了一个t.join。join。方法的作用是强制阻塞调用它的线程,直到该线程运行完毕或者终止(类似单线程同步)。因为调用jcin()方法的变量1正是用Ihre
5、ading.Thread。为Sayafter(what,de1ay)函数创建的用户线程,所以使用内核线程的Print(f程序于timc.strftimc(%X)执行结束)必须等待该用户线程执行完毕后才能继续执行,因此脚本在执行时的效果会让你觉得整体还是以单线程同步的方式运行的。运行代份看效果,如下图所示。rootCentOS-PythOnpython#python3.8threading3.py程序于03:49:19开始发行he11ohe11o程序于03:49:22执行结束可以看到,因为调用了join()方法,在内核线程上运行的Print(f程序于time.Strftinio(%X)执行结束)
6、必须等待在用户线程上运行的Sayafter(what,de1ay)函数执行完毕后,才能继续执行,因此程序前后执行总共花费3s,类似单线程同步的效果。最后举一个例子,来看下如何创建多个用户线程并运行,代码如下。print(”程序于(time.Strftime(,%X,)开始执行n”)threads=(foriinrange(1,6):t=threading.Thread(target=say_after,name=线程”+str(i),args=(,he11o,3)print(t.name+,开始执行。,)t.start()threads.append(t)foriinthreads:i.joi
7、n()print(fn程序于time.Strftime(%X,)执行结束)我们使用for循环配合range。,6)创建了5个线程,并且将它们以多线程的形式执行,也就是把Sayafter(what,de1ay)函数以多线程的形式执行了5次。每个线程都作为元素加入threads空列表,然后使用for语句遍历已经有5个线程的threads列表,对其中的每个线程都调用join。方法,确保直到它们都执行结束,才执行内核线程的Print(f”程序于time.Strftimc(1X)执行结束”)。运行代科看效果,如下图所示。rtCentOS-Pythonpython#pytho3.8threading4.p
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络工程师 Python 网络 自动化 实战