美文网首页
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

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

  • Mysql线程参数详解

    Mysql线程参数详解一、innodb_thread_concurrency1、 innodb_thread_c...

  • 4-Thread类详解与线程的状态分析

    Thread类详解与线程的状态分析 线程的状态 在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪...

  • python--线程current_thread

    源码: tests/current_thread.py 运行: tests/main.py

  • 详解Thread多线程

    如何创建线程 Java 中创建线程的方法有三种: 1. 继承 Thread 类创建线程 新建一个类继承 Threa...

  • 详解Thread多线程

    如何创建线程 Java 中创建线程的方法有三种:1. 继承 Thread 类创建线程 新建一个类继承 Thread...

  • iOS开发之多线程(2)—— Thread

    文集 iOS开发之多线程(1)—— 概述iOS开发之多线程(2)—— ThreadiOS开发之多线程(3)—— G...

  • Java线程Thread类详解

    Thread类是Java中常见的一个类,本文及后面几篇文章详细分析该类是如何实现的。 成员变量 Thread类中与...

  • 线程协程WWW

    线程:Thread // 新线程-1 调用静态方法 Thread m_Thread_1 = new Thread(...

  • Thread

    线程机制理解开启线程: Thread thread = new Thread(Runnable).start();...

网友评论

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

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