龙空技术网

Python并发·如何取消当前的线程

Python路漫漫 347

前言:

现在各位老铁们对“python的线程怎么结束”大约比较重视,你们都需要学习一些“python的线程怎么结束”的相关资讯。那么小编也在网络上搜集了一些对于“python的线程怎么结束””的相关内容,希望兄弟们能喜欢,大家一起来学习一下吧!

通过上一篇文章Python并发·concurrent.futures的细节处理应该熟悉了future实例的submit()和as_completed()方法的使用。

同时介绍了通过pip安装模块时进度条的实现方法。

今天就以如何取消当前的线程为例,介绍一下pip安装模块时|/-\旋转动画的简单实现。

今天的文章同样不要光看,最好运行一下代码看看动画,再自己手动改改疑惑的地方以熟悉各个功能。

首先需要的主体部分:

主体程序

需要的import的模块有

import itertools

from time import sleep

import sys

itertolls.cycle()会从指定的序列中不断产生元素,因此这个循环是无限循环。

sys.stdout的write()和flush()函数不是本文的重点,也可以把sys.stdout.write(‘xx')换成print('xx', end=''),就结果而言是等效的。

注意'\x08'特殊符号,这是退格符,配合*len(status),把输出后右移的光标移回最开始的部分,再输出会从原地开始,导致结果显示就像“原地不动的旋转”。

循环外的两行输出,第一行是输出一行长度为len(status)的空格,然后用退格符*len(status)让光标退回最左边。这样,在函数运行结束后再输出的其他信息就像是把之前的完美抹除了。

这样的代码就产生了一个问题,既然是一个无限循环,如何让正在旋转的动画停止下来?

如果用concurrent.futures启动线程运行这个函数,如何使这个线程终止?

查看futures的文档,会发现提供了一个done()方法判断是否运行完成,以及cancel()方法取消当前的future,成功取消会返回True,那么,似乎可以在submit()后,通过cancel()取消,就终止了当前的线程。

很遗憾,这是无法实现的,运行后会发现,future无法被cancel()取消。

再仔细的看一遍文档和源码,发现cancel()只能取消尚未开始或已经完成的future...

似乎没什么用,总之并不是我们想要的。

好像只能手动通过发送消息来关闭线程了,在无限循环里设置一个终止条件:

这样,就可以通过改变传递的参数来关闭线程:

运行一下这个函数,动画旋转了3s后果然成功停止了:

整体的实现就是如此。需要注意的是:

concurrent中future的cancel()方法几乎没有意义,不能用于取消正在运行的线程·进程。

只能通过从外部设定状态发送消息来终止,这就不止本文这一种方式了。

具体实现代码可以从获取,今天除了用concurrent模块实现外,链接中还提供了一个threading模块实现的代码以比较区别。

标签: #python的线程怎么结束 #python关闭子线程 #python结束子线程 #线程终止函数