这篇文章主要介绍了 python 线程的暂停, 恢复, 退出详解及实例的相关资料, 需要的朋友可以参考下
Python 是一种面向对象、解释型计算机程序设计语言,由 Guido van Rossum 于 1989 年底发明,第一个公开发行版发行于 1991 年。Python 语法简洁而清晰,具有丰富和强大的类库。它常被昵称为胶水语言,它能够把用其他语言制作的各种模块(尤其是 C/C++)很轻松地联结在一起。
python 线程 暂停, 恢复, 退出
我们都知道 python 中可以是 threading 模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用 start 方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦 start 后, 线程就属于失控状态. 不过, 我们可以自己实现这些. 一般的方法就是循环地判断一个标志位, 一旦标志位到达到预定的值, 就退出循环. 这样就能做到退出线程了. 但暂停和恢复线程就有点难了, 我一直也不清除有什么好的方法, 直到我看到 threading 中 Event 对象的 wait 方法的描述时.
- wait([timeout]) Block until the internal flag is true.If the internal flag is true on entry,
- return immediately.Otherwise,
- block until another thread calls set() to set the flag to true,
- or until the optional timeout occurs.阻塞,
- 直到内部的标志位为True时.如果在内部的标志位在进入时为True时,
- 立即返回.否则,
- 阻塞直到其他线程调用set()方法将标准位设为True,
- 或者到达了可选的timeout时间.When the timeout argument is present and not None,
- it should be a floating point number specifying a timeout
- for the operation in seconds(or fractions thereof).This method returns the internal flag on exit,
- so it will always
- return True except
- if a timeout is given and the operation times out.当给定了timeout参数且不为None,
- 它应该是一个浮点数,以秒为单位指定操作的超时(或是分数)。此方法在退出时返回内部标志,因此除非给定了超时且操作超时,否则它将始终返回True。Changed in version 2.7 : Previously,
- the method always returned None.2.7版本以前,
- 这个方法总会返回None.
利用 wait 的阻塞机制, 就能够实现暂停和恢复了, 再配合循环判断标识位, 就能实现退出了, 下面是代码示例:
- #!/usr/bin/env python
- # coding: utf-8
- import threading
- import time
- class Job(threading.Thread):
- def __init__(self, *args, **kwargs):
- super(Job, self).__init__(*args, **kwargs)
- self.__flag = threading.Event() # 用于暂停线程的标识
- self.__flag.set() # 设置为True
- self.__running = threading.Event() # 用于停止线程的标识
- self.__running.set() # 将running设置为True
- def run(self):
- while self.__running.isSet():
- self.__flag.wait() # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
- print time.time()
- time.sleep(1)
- def pause(self):
- self.__flag.clear() # 设置为False, 让线程阻塞
- def resume(self):
- self.__flag.set() # 设置为True, 让线程停止阻塞
- def stop(self):
- self.__flag.set() # 将线程从暂停状态恢复, 如何已经暂停的话
- self.__running.clear() # 设置为False
下面是测试代码:
- a = Job()
- a.start()
- time.sleep(3)
- a.pause()
- time.sleep(3)
- a.resume()
- time.sleep(3)
- a.pause()
- time.sleep(2)
- a.stop()
测试的结果:
这完成了暂停, 恢复和停止的功能. 但是这里有一个缺点: 无论是暂停还是停止, 都不是瞬时的, 必须等待 run 函数内部的运行到达标志位判断时才有效. 也就是说操作会滞后一次.
但是这有时也不一定是坏事. 如果 run 函数中涉及了文件操作或数据库操作等, 完整地运行一次后再退出, 反而能够执行剩余的资源释放操作的代码 (例如各种 close). 不会出现程序的文件操作符超出上限, 数据库连接未释放等尴尬的情况.
来源: http://www.phperz.com/article/17/0320/313672.html