python程序的运行是由一个或者多个进程来进行执行的,但是具体的实现和内存的占用还是由进程内的线程去完成的。简单的说,一个进程由多个线程组成,不同的线程会完成不同的任务。
可以用
threading.activeCount()
来查看正在运行的线程数量。
终止线程的一些方法:
1、设置一个退出标志flag:
一个比较好用的方式就是在每一个线程后面都加上一个退出的请求标志,表示在执行完成后就自动的退出,不再占用资源和内存。
在线程的run方法中可以根据这个标志位是为true还是为false来判断是否满足终止条件,这种情况多用于while循环中。
Threads = []
# 将会启动与搜索结果等量个线程,线程满足一定条件时则全部线程终止!
for i in range(0,len(self.g_results)):
t = threading.Thread(target=self.get_page,args=(i+1,))
t.daemon = 1
Threads.append(t)
# 启动所有线程
for i in Threads:
i.start()
# 当标志位【 flag 】时所有多线程结束
while 1:
if self.__flag:
break
# 导入线程操作模块threading
import threading
# 定义一个函数在执行完毕后自动退出
def __init__(self):
super(this, self).__init__()
self._stop_event = threading.Event()
2、使用 stop() 方法强行终止线程
但是不推荐使用这个方法,因为使用此方法不安全,目前该方法已被弃用;
3、使用 interrupt()方法中断线程
断线程时并不会立即终止线程,而是通知目标线程,告诉它有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。
4、异常处理停止
在python之中停止一个线程可以raise一个Exception,也就是是异常来停止线程。这个方法的缺点在于如果线程在解释器busy之外,那么就无法捕获异常。应该指定一个异常然后清理就能停止线程了,示例如下:
# 定义一个函数表示线程
def counts(flag):
# 进入函数就强制捕获异常来停止线程
if flag:
raise ValueError("数据错误")
中止线程的方法:1、使用退出标志: 在线程的run方法中根据这个标志位是为true还是为false来判断是否终止,这种情况多用于while循环中。2、使用 stop() 方法强行终止线程, 但是不推荐使用这个方法,因为使用此方法不安全,目前该方法已被弃用;3、使用 interrupt()方法中断线程 断线程时并不会立即终止线程,而是通知目标线程,告诉它有人希望你终止。至于目标线程收到通知后会如何处理,则完全由目标线程自行决定。...
进程想要执行任务就需要依赖
线程
。换句话说,就是进程中的最小执行单位就是
线程
,并且一个进程中至少有一个
线程
。
那什么是
多线程
?提到
多线程
这里要说两个概念,就是串行和并行,搞清楚这个,我们才能更好地理解
多线程
。
所谓串行,其实是相对于单条
线程
来执行多个任务来说的,我们就拿下载文件来举个例
子
:当我们下载多个文件时,在串行中它是按照一定的顺序去进行下载的,也就是说,必须等下载完A之后才能开始下载B,它们在时间上是不可能发生重叠的。
并行:下载多个文件,开启多条
线程
,多个文件同时进行下载,这里是严格意义上的,在同一时刻发生的,并行在时间上是重叠的。
问题描述:
前几天写一个项目,然后项目中有一个死循
1.
python
threading.Thread只能使用一次start(), 否则会报RuntimeError
2.
python
threading.Thread无法kill,但是可以用threading.Condition()来控制
线程
的启动和
停止
import threading
import time
class Concur(threading.Thread):
de...
Timer 一般会设置一个间隔时间,然后才开一个
子
线程
执行需要执行的函数。
cancel() 函数只能取消还未开始执行的 Timer,也就是取消该 Timer。如果 Timer 已经开启
子
线程
执行函数了,用 cancel() 函数 是不能
停止
子
线程
执行的,
子
线程
会一直执行,直到结束。
使用下面这个函数强制
停止
子
线程
:
import ctypes
import datetime
import inspect
def stop_thread(thread):
tid = thread.ident
python
threading 启动的
线程
,并没有提供终止
线程
的方法,现总结一下在网上找到的方法
1、通过threading.Thread._Thread__stop()结束
线程
import time
import threading
def f():
while 1:
time.sleep(0.1)
print(1)
t = thread...
python
关闭
线程
的方法:首先导入threading,定义一个方法;然后定义
线程
,target指向要执行的方法,启动它;最后
停止
线程
,代码为【stop_thread(myThread)】。
python
关闭
线程
的方法:一、启动
线程
首先导入threading
然后定义一个方法
然后定义
线程
,target指向要执行的方法
二、
停止
线程
不多说了直接上代码
停止
线程
...
多线程
的出现是为了能够帮助我们解决资源被霸占的问题,下面看看它的基本使用。
pycharm下的运行结果
可以看到,一个2秒一个3秒的任务只需3秒就完成了,说明这两个任务确实是同时进行的。命名
每个
线程
名默认是以 thread-xx 命名的,如果想自己定义的话,可以在创建实例对象时用name进行指明。
当我们调用函数需要传递参数时,在创建实例对象时用 args 或 kwargs 指明。
threading的进一步使用
Daemon
线程
......
可以使用 threading 库中的 Thread 对象的 setDaemon(True) 方法将
子
线程
设置为守护
线程
,然后在主
线程
中使用 join(timeout) 方法等待
子
线程
结束,如果超时时间到达仍未结束,则可以使用 _stop() 方法强制
终止子
线程
。代码示例:
import threading
import time
def worker():
while True:
print("working...")
time.sleep(1)
t = threading.Thread(target=worker)
t.setDaemon(True)
t.start()
# 等待
子
线程
结束
t.join(5)
# 如果
子
线程
未结束,则强制终止
if t.is_alive():
t._stop()
print("
子
线程
已强制终止")