美文网首页
Python--之多线程详解一_thread

Python--之多线程详解一_thread

作者: 酒深巷子Ya | 来源:发表于2018-04-08 22:50 被阅读86次

    一、线程的几个常用的函数

    1.生成一个新线程
     start_new_thread(function, args, kwargs = None)
    2.分配LockType锁对象
    allocate_lock()
    3.线程推出指令
    exit()
    LockType对象的方法
    1.获取锁对象
    acquire()
    2. 如果获取了锁对象返回True 否则False
    locked()
    3.释放所
    release()
    

    二、结合实例来看一下_thread 和 上述函数的用法
    1.首先看一下为什么要引入多线程,首先看一段代码

    date_time_format = "%y-%M-%d  %H:%M:%S"
    def date_time_str(date_time):
        return datetime.strftime(date_time, date_time_format)
    
    def loop0():
        print('start loop0 at:', date_time_str(datetime.now()))
        sleep(4)
        print('loop0 done at:', date_time_str(datetime.now()))
    
    def loop1():
        print('start loop1 at:', date_time_str(datetime.now()))
        sleep(2)
        print('loop1 done at:', date_time_str(datetime.now()))
    
    def main():
        print('starting at:', date_time_str(datetime.now()))
        loop0()
        loop1()
        print('all DONE at:', date_time_str(datetime.now()))
    
    if __name__ == '__main__':
        main()
    
    打印结果如下: Screen Shot 2018-04-09 at 00.05.23.png

    执行以上代码至少需要6秒时间,先执行完loop0()然后再执行loop1()。如果loop0() 和 loop1()是两个独立计算操作的函数,让他们并行执行减少总的时间,这就是为什么我们要使用多线程。
    2.使用多线程技术,代码如下:

    date_time_format = "%y-%M-%d  %H:%M:%S"
    def date_time_str(date_time):
        return datetime.strftime(date_time, date_time_format)
    
    def loop0():
        print('start loop0 at:', date_time_str(datetime.now()))
        sleep(4)
        print('loop0 done at:', date_time_str(datetime.now()))
    
    def loop1():
        print('start loop1 at:', date_time_str(datetime.now()))
        sleep(2)
        print('loop1 done at:', date_time_str(datetime.now()))
    
    def main():
        print('starting at:', date_time_str(datetime.now()))
        _thread.start_new_thread(loop0, ())
        _thread.start_new_thread(loop1, ())
        sleep(6)
        print('all DONE at:', date_time_str(datetime.now()))
    
    if __name__ == '__main__':
        main()
    
    执行结果如下: Screen Shot 2018-04-09 at 00.07.43.png

    从结果可以看出loop0() 和 loop1()是同时开始执行的,且loop1()先于loop0()执行完。
    为什么增加一个sleep(6)? sleep(6)在这里作为同步机制来阻止主线程继续执行,如果没有该语句,主线程会直接执行完毕,然后退出,这将导致loop0() 和 loop1()两个线程直接终止。

    3.引入更好的同步机制 ‘锁’ 代码如下

    date_time_format = "%y-%M-%d  %H:%M:%S"
    def date_time_str(date_time):
        return datetime.strftime(date_time, date_time_format)
    loops = [2, 4]
    def loop(nloop, nsec, lock):
        print('start loop', nloop, 'at:',date_time_str(datetime.now()))
        sleep(nsec)
        print('loop', nloop, 'done at:', date_time_str(datetime.now()))
        lock.release()
    
    def main():
        print('Starting ar:',date_time_str(datetime.now()))
        locks = []
        nloops = range(len(loops))
    
        for i in nloops:
            lock = _thread.allocate_lock()
            lock.acquire()
            locks.append(lock)
    
        for i in nloops:
            _thread.start_new_thread(loop, (i, loops[i], locks[I]))
    
        for i in nloops:
            while locks[i].locked():
                pass
        print('all NONE AT:', date_time_str(datetime.now()))
    
    if __name__ == '__main__':
        main()
    
    执行结果如下: Screen Shot 2018-04-09 at 00.17.17.png

    从结果可以看出,整个过程只用了4秒的时间,这就实现了我们使用多线程技术编程的目的。

    三、注意事项
    在实例2中:

     _thread.start_new_thread(loop0, ())
       _thread.start_new_thread(loop1, ())
    

    第一个参数传入的是函数名 不能加括号,否则会报【TypeError: first arg must be callable】错误。这种错的原因一般是由于函数作为参数时,多了括号()造成的,加括号表示有返回值,不加括号没有返回值。

    下节python 多线程高级模块Threading
    未完待续~🙈

    相关文章

      网友评论

          本文标题:Python--之多线程详解一_thread

          本文链接:https://www.haomeiwen.com/subject/dpomhftx.html