技术前沿您现在的位置:主页 > 技术前沿 >

Python中线程的方法

发布日期:2017-12-26 09:54

我们都知道python中可所以threading模块完成多线程, 可是模块并没有供给暂停, 康复和中止线程的办法, 一旦线程目标调用start办法后, 只能等到对应的办法函数运转结束. 也就是说一旦start后, 线程就归于失控状态. 不过, 我们可以自己完成这些. 一般的办法就是循环地判别一个标志位, 一旦标志位到抵达预订的值, 就退出循环. 这样就能做到退出线程了. 但暂停和康复线程就有点难了, 西安Java培训整理的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 threadingimport 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). 不会呈现程序的文件操作符超出上限, 数据库衔接未开释等为难的状况.