python-多线程处理

前端外刊评论 2018-01-23

Python多线程

Python 提供了多个模块来支持多线程编程,包括 thread、threading 和 Queue 模块等。程序是可以使用 thread 和 threading 模块来创建与管理线程。

thread 模块提供了基本的线程和锁定支持;而 threading 模块提供了更高级别、功能更全面的线程管理。

使用 Queue 模块,用户可以创建一个队列数据结构,用于在多线程之间进行共享。

在python3.0中,已经将thread改名为_thread

Python 代码的执行是由 Python 虚拟机(又名解释器主循环)进行控制的。

对 Python 虚拟机的访问是由全局解释器锁(GIL)控制的。这个锁就是用来保证同时只能有一个线程运行的。在多线程环境中,Python 虚拟机将按照下面所述的方式执行。

1.设置 GIL。
2.切换进一个线程去运行。
3.执行下面操作之一。
a.指定数量的字节码指令。
b.线程主动让出控制权(可以调用 time.sleep(0)来完成)。
4.把线程设置回睡眠状态(切换出线程)。
5.解锁 GIL。
6.重复上述步骤。

当一个线程完成函数的执行时,它就会退出。另外,还可以通过调用诸如 thread.exit()之类的退出函数,或者 sys.exit()之类的退出 Python 进程的标准方法,亦或者抛出 SystemExit异常,来使线程退出。不过,你不能直接“终止”一个线程。

python多线程支持的平台:

绝大多数类 UNIX 平台(如 Linux、Solaris、Mac OS X、*BSD 等),以及Windows 平台。

Python 使用兼容 POSIX 的线程,也就是pthread,点击跳转百度百科

不使用线程的情况

我们将使用 time.sleep()函数来演示线程是如何工作的

创建两个时间循环:一个睡眠 4 秒(loop0());另一个睡眠 2 秒(loop1()) (这里使用“loop0”和“loop1”作为函数名,暗示我们最终会有一个循环序列)。

import time

def loop0():
    print("start loop 0 at: %s" % time.ctime())
    time.sleep(4)
    print("loop 0 done at: %s" % time.ctime())


def loop1():
    print("start loop 1 at: %s" % time.ctime())
    time.sleep(2)
    print("loop 1 done at: %s" % time.ctime())


def main():
    print("starting at: %s" % time.ctime())
    loop0()
    loop1()
    print("all DONE at: %s" % time.ctime())


if __name__ == '__main__':
    main()
python-多线程处理python-多线程处理
starting at: Tue Jan 23 16:03:21 2018
start loop 0 at: Tue Jan 23 16:03:21 2018
loop 0 done at: Tue Jan 23 16:03:25 2018
start loop 1 at: Tue Jan 23 16:03:25 2018
loop 1 done at: Tue Jan 23 16:03:27 2018
all DONE at: Tue Jan 23 16:03:27 2018

从输出中我们可以看出,输出整整花了我们7秒钟的时间
单线程的输出结果

_thread模块-一个不建议使用的模块

_thread模块和锁对象

python-多线程处理

thread 模块的核心函数是 start_new_thread()。它的参数包括函数(对象)、函数的参数以及可选的关键字参数。

start_new_thread()必须包含开始的两个参数,于是即使要执行的函数不需要参数,也需要传递一个空元组。

使用_thread模块进行编程:

我们只需要将上面的代码进行稍微改动一下即可

import time
import _thread


def loop0():
    print("start loop 0 at: %s" % time.ctime())
    time.sleep(4)
    print("loop 0 done at: %s" % time.ctime())


def loop1():
    print("start loop 1 at: %s" % time.ctime())
    time.sleep(2)
    print("loop 1 done at: %s" % time.ctime())


def main():
    print("starting at: %s" % time.ctime())
    _thread.start_new_thread(loop0, ())
    _thread.start_new_thread(loop1, ())
    time.sleep(5)    #暂停5秒,原因是因为我们的loop0函数暂停了4秒,如果我们小于4秒会出现无法输出loop 0 done...
    print("all DONE at: %s" % time.ctime())


if __name__ == '__main__':
    main()
python-多线程处理python-多线程处理
starting at: Tue Jan 23 16:14:19 2018
start loop 0 at: Tue Jan 23 16:14:19 2018
start loop 1 at: Tue Jan 23 16:14:19 2018
loop 1 done at: Tue Jan 23 16:14:21 2018
loop 0 done at: Tue Jan 23 16:14:23 2018
all DONE at: Tue Jan 23 16:14:24 2018

从输出结果中我们可以看到loop0和loop1同时启动了,而不会先执行完loop0在执行loop1
_thread多线程输出结果

相关推荐