线程与threading模块(python)

来源:互联网 发布:js array map ie8 编辑:程序博客网 时间:2024/05/20 03:45

本篇文章介绍线程的概念,并举例用threading模块实现多线程。

线程:线程又叫做轻量级进程,是基本的cpu执行单元。它被包含在进程之中,是进程中的实际运作单位。线程由线程ID、程序计数器、寄存器集合和堆栈共同组成。线程的引入减小了程序并发执行时的开销,提高了操作系统的并发性能。线程没有自己的系统资源,一个进程中的所有线程共享该进程所有的系统资源。

Python 标准库提供了 thread 和 threading 两个模块来对多线程进行支持。其中 thread 模块以低级、原始的方式来处理和控制线程,而 threading 模块通过对 thread 进行二次封装,提供了更方便的 api 来处理线程。本文主要介绍threading模块。
首先创建一个线程:一种是通过继承Thread类,重写它的run方法;另一种是创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入。分别举例说明:
__author__ = "Allen Liu"__time__ = "2017/8/11"'''This program used to '''import threading# 自定义线程类,继承自Thread类并重写其run方法class MyThread(threading.Thread):    def __init__(self, name):        # 继承父类__init__方法        threading.Thread.__init__(self)        self.name = name    def run(self): # 重写run方法        print("running on:%s" % self.name)t1 = MyThread('Threading-1') # 创建线程实例t2 = MyThread('Threading-2')t1.start()# 调用start方法启动线程t2.start()
输出为:
running on:Threading-1running on:Threading-2
通过创建一个threading.Thread对象创建线程:
__author__ = "Allen Liu"__time__ = "2017/8/11"'''This program used to '''import threadingimport timedef run(name):    print("running on: %s" % name)    #time.sleep(1)s = time.time()t1 = threading.Thread(target=run, args =  ('Threading-1', )) # 创建线程,参数以元组的形式传入t2 = threading.Thread(target=run, args = ('Threading-2', ))t1.start()  # 运行线程t2.start()print("ending")  # 多线程的主进程

直接调用threading.Thread来构造thread对象时,Thread的参数如下:
class threading.Thread(group=None, target=None, name=None, args=(), kwargs={})  
group为None;
target为线程将要执行的功能函数;
name为线程的名字,也可以在对象构造后调用setName()来设定;
args为tuple类型的参数,可以为多个,如果只有一个也的使用tuple的形式传入,例如(1,);
kwargs为dict类型的参数,也即位命名参数;

threading.Thread对象的其他方法:
start(),用来启动线程;
join(), 等待直到线程结束;
isAlive(),获取线程状态
setDeamon(), 设置线程为deamon线程,必须在start()调用前调用,默认为非demon。
注意: python的主线程在没有非deamon线程存在时就会退出。
threading.currentthread() , 用来获得当前的线程;
threading.enumerate() , 用来多的当前存活的所有线程;

创建的多个线程可以以串行的方式工作也可以以并行的方式工作,下面举例如下:
多个线程串行工作:
__author__ = "Allen Liu"__time__ = "2017/8/11"'''This program used to '''import threadingimport timebegin = time.time()# 记录程序的起始时间def run(name):    print("running on: %s" % name)    time.sleep(1)threads = []# 实例化10个线程for i in range(10):    threads.append(threading.Thread(target=run, args=(('Threading-%s' % i), )))# 依次运行10个线程for t in threads:    t.start()    t.join()end = time.time() # 记录程序的结束时间print("All running time is: %s" % (end - begin))
输出为:
running on: Threading-0running on: Threading-1running on: Threading-2running on: Threading-3running on: Threading-4running on: Threading-5running on: Threading-6running on: Threading-7running on: Threading-8running on: Threading-9All running time is: 10.006572246551514
并发工作(注意与并行的区别):
import threadingimport timebegin = time.time()# 记录程序的起始时间def run(name):    print("running on: %s" % name)    time.sleep(1)threads = []# 实例化10个线程for i in range(10):    threads.append(threading.Thread(target=run, args=(('Threading-%s' % i), )))# 依次运行10个线程for t in threads:    t.start()for t in threads:    t.join()end = time.time() # 记录程序的结束时间print("All running time is: %s" % (end - begin))
输出为:
running on: Threading-0running on: Threading-1running on: Threading-2running on: Threading-3running on: Threading-4running on: Threading-5running on: Threading-6running on: Threading-7running on: Threading-8running on: Threading-9All running time is: 1.0010573863983154










原创粉丝点击