python中的线程

1.线程的创建

1.1 通过thread类直接创建

    import threading
    import time

    def foo(n):
        time.sleep(n)
        print("foo func:",n)

    def bar(n):
        time.sleep(n)
        print("bar func:",n)

    s1=time.time()

    #创建一个线程实例t1,foo为这个线程要运行的函数
    t1=threading.Thread(target=foo,args=(3,))
    t1.start()    #启动线程t1

    #创建一个线程实例t2,bar为这个线程要运行的函数
    t2=threading.Thread(target=bar,args=(5,))
    t2.start()    #启动线程t2

    print("ending")

    s2=time.time()

    print("cost time:",s2-s1)

在这段程序里,一个函数会先休眠几秒钟,然后再打印一句话,第二个函数也是先休眠几秒钟,然后打印一句话。

接着程序会实例化两个线程,并调用两个函数来执行,最后会打印程序问总共执行了多少时间

程序运行结果如下:

ending
cost time: 0.002000093460083008
foo func: 3
bar func: 5

程序会先运行父线程,打印"ending",然后打印程序执行父线程的时间,最后才会运行子线程

1.2 通过thread类来继承式创建

    import threading
    import time

    # 定义MyThread类,其继承自threading.Thread这个父类
    class MyThread(threading.Thread): 

        def __init__(self):
            threading.Thread.__init__(self)

        def run(self):
            print("ok")
            time.sleep(2)
            print("end t1")

    # 对类进行实例化
    t1=MyThread()

    # 启动线程
    t1.start()
    print("ending")

2. Thread类的一些常用方法

2.1 join():在子线程完成之前,主线程将一直被阻塞****

线程的join方法必须在子线程的start方法之后定义

在第一个例子中加入两行代码,如下:

    import threading
    import time

    def foo(n):
        time.sleep(n)
        print("foo func:",n)

    def bar(n):
        time.sleep(n)
        print("bar func:",n)

    s1=time.time()
    t1=threading.Thread(target=foo,args=(3,))
    t1.start()

    t2=threading.Thread(target=bar,args=(5,))
    t2.start()

    t1.join()       # 阻塞t1线程
    t2.join()       # 阻塞t2线程

    print("ending")
    s2=time.time()

    print("cost time:",s2-s1)

再次执行程序,运行结果如下:

foo func: 3
bar func: 5
ending
cost time: 5.002285957336426

程序运行到子线程t1中的foo方法时会睡眠3秒钟,与此同时,子线程t2也在睡眠

等到子线程t1睡眠完成后,开始打印foo函数中的print语句,然后子线程t1执行完成

2秒钟之后,子线程t2睡眠完成,开始打印bar函数中的print语句,然后子线程t2也执行完成。

而在这之前,主线程一直处于阻塞状态。等到子线程执行完成之后主线程才会执行

2.2 setDeamon(True)

setDaemon方法作用是将进程声明为守护线程,必须在`start()`方法调用之前,

如果不设置为守护线程,程序会被无限挂起

在程序执行过程中,执行一个主线程,主线程又创建一个子线程时,主线程和子线程会分别运行。

当主线程运行完成时,会检验子线程是否执行完成,如果子线程执行完成,则主线程会等待子线程完成后再退出。

但是有的时候只要主线程执行完成之后,不管子线程是否执行完成,都和主线程一起退出,这个就需要调用setDeamon方法了。

拿第一个例子来说吧,现在我想让子线程t1和t2随同主线程关闭,代码如下:

    import threading
    import time

    def foo(n):
        print("foo start")
        time.sleep(n)
        print("foo end...")

    def bar(n):
        print("bar start")
        time.sleep(n)
        print("bar end...")

    s1 = time.time()
    t1 = threading.Thread(target=foo, args=(3,))
    t1.setDaemon(True)
    t1.start()

    t2 = threading.Thread(target=bar, args=(5,))
    t2.setDaemon(True)
    t2.start()

    print("ending")
    s2 = time.time()

    print("cost time:", s2 - s1)

程序运行结果如下 :

foo start
bar start
ending
cost time: 0.003000020980834961

可以看到,把t1和t2都声明为守护线程后,程序自上而下执行,先执行子线程t1中的foo方法,打印foo函数中的第一条打印语句,然后子线程t1进入到睡眠状态。

然后子线程t2执行,打印bar函数中的第一条print语句,然后子线程t2进入睡眠状态,程序切换到主线程运行

主线程打印完"ending"语句,发现子线程t1和t2已经被设置为守护线程,所以主线程不需要再等待两个子线程执行完成,而是立即结束,打印整个程序的执行时间。

整个程序就跟随主线程一起关闭了。

2.3 子线程的一些其他方法

isAlive()           #判断一个线程是否是活动线程
getName()           #返回线程的名字
setName()           #设置线程的名字
    import threading
    import time

    def foo(n):
        time.sleep(n)
        print("foo func:", n)

    def bar(n):
        time.sleep(n)
        print("bar func:", n)

    s1 = time.time()
    t1 = threading.Thread(target=foo, args=(3,))
    t1.setDaemon(True)

    print("线程还未启动时,判断t1是否是活动的线程:", t1.isAlive())  # 线程还未启动,所以是False
    t1.start()  # 启动线程
    print("线程已启动时,判断t1是否是活动的线程:", t1.isAlive())  # 线程已启动,所以是True
    print("修改前的线程名为:",t1.getName())  # 获取线程名
    t1.setName("t1")        #设置线程名
    print("修改后的线程名为:",t1.getName())  # 获取线程名

    t1.join()

    print("线程执行完成时,判断t1是不否是活动的线程:", t1.isAlive())  # 线程已执行完成,所以是False

    # print(threading.activeCount())
    print("ending")
    s2 = time.time()

    print("cost time:", s2 - s1)

程序执行结果:

线程还未启动时,判断t1是否是活动的线程: False
线程已启动时,判断t1是否是活动的线程: True
修改前的线程名为: Thread-1
修改后的线程名为: t1
foo func: 3
线程执行完成时,判断t1是不否是活动的线程: False
ending
cost time: 3.001171588897705

3.threading模块提供的一些方法

threading.currentThread()   #返回当前的线程变量
threading.enumerate()       #返回一个包含正在运行的线程的列表,不包括启动前和终止后的线程
threading.activeCount()     #返回正在运行的线程数量,等同于len(threading.enumerate())
    import threading
    import time

    def foo(n):
        time.sleep(n)
        print("foo func:", n)

    def bar(n):
        time.sleep(n)
        print("bar func:", n)

    s1 = time.time()
    t1 = threading.Thread(target=foo, args=(3,))
    t1.setDaemon(True)
    t1.start()

    t2 = threading.Thread(target=bar, args=(5,))
    t2.setDaemon(True)
    t2.start()

    print("程序中正在运行的线程数量:",threading.activeCount())
    print("程序中当前的线程变量:",threading.currentThread())
    print("当前正在运行的线程的列表:",threading.enumerate())
    print("ending")
    s2 = time.time()

    print("cost time:", s2 - s1)

程序执行结果:

程序中正在运行的线程数量: 3
程序中当前的线程变量: <_MainThread(MainThread, started 7064)>
当前正在运行的线程的列表: [<_MainThread(MainThread, started 7064)>, <Thread(Thread-1, started daemon 6384)>, <Thread(Thread-2, started daemon 2640)>]
ending
cost time: 0.002000093460083008

原文地址:https://www.cnblogs.com/renpingsheng/p/8437027.html

时间: 2024-10-20 01:52:04

python中的线程的相关文章

理解 Python 中的线程

原地址:http://blog.jobbole.com/52060/ 本文由 伯乐在线 - acmerfight 翻译自 Akshar Raaj.欢迎加入技术翻译小组.转载请参见文章末尾处的要求. 我们将会看到一些在Python中使用线程的实例和如何避免线程之间的竞争.你应当将下边的例子运行多次,以便可以注意到线程是不可预测的和线程每次运行出的不同结果.声明:从这里开始忘掉你听到过的关于GIL的东西,因为GIL不会影响到我想要展示的东西. 示例1 我们将要请求五个不同的url: 单线程 1 2

python中的线程(zz)

引言 一.线程 1.1 普通的多线程1.2 自定义线程类1.3 线程锁1.3.1 未使用锁1.3.2 普通锁Lock和RLock1.3.3 信号量(Semaphore)1.3.4 事件(Event)1.3.5 条件(condition)1.3 全局解释器锁(GIL)1.4 定时器(Timer)1.5 队列1.5.1 Queue:先进先出队列1.5.2 LifoQueue:后进先出队列1.5.3 PriorityQueue:优先级队列1.5.4 deque:双向队列1.6 生产者消费者模型1.7

Python中的线程与进程

进程与线程 在多任务处理中,每一个任务都有自己的进程,一个任务会有很多子任务,这些在进程中开启线程来执行这些子任务.一般来说,可以将独立调度.分配的基本单元作为线程运行,而进程是资源拥有的基本单位. python支持多进程multiprocessing,以及多线程threading. 多进程 os.fork()函数可以开启一个进程.该函数会返回两次值,分别在父进程中返回子进程的ID,而在子进程中永远返回0. os.getpid()函数可以返回进程的ID.os.getppid()则可以返回父进程的

Python学习—python中的线程

1.线程定义 线程是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务.一个进程至少有一个线程,一个进程必定有一个主线程. 2.创建线程 创建线程的两个模块:(1)thread(在python3中改名为_thread)(2)threding_thread提供了低级别的.原始的线程以及一个简单的锁.threading基于Java的线程模型设计.thread和threadin

python中的线程和进程

进程与线程的历史 我们都知道计算机是由硬件和软件组成的.硬件中的CPU是计算机的核心,它承担计算机的所有任务. 操作系统是运行在硬件之上的软件,是计算机的管理者,它负责资源的管理和分配.任务的调度. 程序是运行在系统上的具有某种功能的软件,比如说浏览器,音乐播放器等. 每次执行程序的时候,都会完成一定的功能,比如说浏览器帮我们打开网页,为了保证其独立性,就需要一个专门的管理和控制执行程序的数据结构——进程控制块. 进程就是一个程序在一个数据集上的一次动态执行过程. 进程一般由程序.数据集.进程控

python中线程和进程相关

1.操作系统/应用程序 a : 硬盘 , CPU , 主板 , 显卡 , 内存 , 电源 ... b.装系统 (软件) 系统就是一个由程序员写出来的软件 , 该软件用于控制计算机的硬件 , 让他们之间相互进行配合. c.安软件 (安装应用程序) QQ 百度云 pycharm .... 2.操作中的"并发"   ('并行') 并发 , 伪 , 由于执行速度特别快 , 人感觉不到停顿. 并行 , 真 , 创建10个人同时操作. 3.其他语言线程 , 进程 a. 单进程 , 单线程的应用程序

python中线程和进程(一)

目录 进程和线程 Python中的线程 1. Thread类 2. 线程的启动 3. 线程的传参 4. 线程的属性和方法 5. daemon线程和non-daemon线程 6. join方法 7. 定时器Timer 进程和线程 进程:进程是计算机中程序正在执行的实例,是系统进行资源分配和调度的基本单位. 线程:也被称为轻量级进程,是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针,寄存器集合和堆栈组成. 线程和进程的关系: 现代操作系统中,每一个进程都认为自己独占所有的计算机资源.进

关于进程、线程、协程在python中的使用问题

描述 最近在python中开发一个人工智能调度平台,因为计算侧使用python+tensorflow,调度侧为了语言的异构安全性,也选择了python,就涉及到了一个调度并发性能问题,因为业务需要,需要能达到1000+个qps的业务量需求,对python调度服务的性能有很大挑战.具体的架构如下面所示: 补充:架构中使用的python为cpython,解释执行的语言,并非jpython或者pypython,cpython的社区环境比较活跃,很多开发包都是现在cpython下实现的,比如项目中计算模

python基础-------进程线程(二)

Python中的进程线程(二) 一.python中的"锁" 1.GIL锁(全局解释锁) 含义: Python中的线程是操作系统的原生线程,Python虚拟机使用一个全局解释器锁(Global Interpreter Lock)来互斥线程对Python虚拟机的使用.为了支持多线程机制,一个基本的要求就是需要实现不同线程对共享资源访问的互斥,所以引入了GIL.GIL:在一个线程拥有了解释器的访问权之后,其他的所有线程都必须等待它释放解释器的访问权,即使这些线程的下一条指令并不会互相影响.在