返回顶部
首页 > 资讯 > 后端开发 > Python >python3 多线程编程
  • 922
分享到

python3 多线程编程

多线程 2023-01-31 08:01:22 922人浏览 八月长安

Python 官方文档:入门教程 => 点击学习

摘要

0.什么是线程 多线程模块 创建线程的方法 join()方法 4.isAlive()方法 name属性和daemon属性 6.线程的同步---锁 7.线程的同步---Event对象 8.线程的同步---Condition条件

0.什么是线程

  1. 多线程模块

  2. 创建线程的方法

  3. join()方法

4.isAlive()方法

  1. name属性和daemon属性

6.线程的同步---

7.线程的同步---Event对象

8.线程的同步---Condition条件变量

0.什么是线程

线程是CPU分配资源的基本单位。但一个程序开始运行,这个程序就变成了一个进程,而一个进程相当于一个或者多个线程。当没有多线程编程时,一个进程也是一个主线程,但有多线程编程时,一个进程包含多个线程,包括主线程。使用线程可以实现程序的并发

  1. 多线程模块

python3对多线程支持的是 threading 模块,应用这个模块可以创建多线程程序,并且在多线程间进行同步和通信。在python3 中,可以通过两种方法来创建线程:

第一:通过 threading.Thread 直接在线程中运行函数;第二:通过继承 threading.Thread 类来创建线程

  1. 创建线程的方法

1.用 thread.Thread 直接在线程中运行函数

[Python] view plain copy

import threading  

def threadfun(x,y):         #线程任务函数 threadfun()  
    for i in range(x,y):  
        print(i)  

ta = threading.Thread(target=threadfun,args=(1,6))      #创建一个线程ta,执行 threadfun()  
tb = threading.Thread(target=threadfun,args=(10,15))    #创建一个线程tb,执行threadfun()  
ta.start()          #调用start(),运行线程  
tb.start()          #调用start(),运行线程  
'''''打印:1 2 3 4 5 10 11 12 13 14'''  

2.通过继承 thread.Thread 类 来创建线程

这种方法只需要重载 threading.Thread 类的 run 方法,然后调用 start()开启线程就可以了

[python] view plain copy

import threading  

class mythread(threading.Thread):  
    def run(self):  
        for i in range(1,5):  
            print(i)  

ma = mythread();  
mb = mythread();  
ma.start()  
mb.start()  
  1. join()方法

join()作用是 调用 join() 的线程 阻塞直到 某一线程结束才继续执行

[python] view plain copy

import threading  
import time  
class mythread(threading.Thread):  
    def run(self):  
        self.i = 1  
        print('%d'%(self.i))  
        self.i = self.i+1  
        time.sleep(1)           #睡眠一秒  
        print('%d'%(self.i))  
        time.sleep(1)  

if __name__ == '__main__':  
    ta = mythread()     #实例化线程  
    ta.start()          #开启ta线程  
    ta.join()           #主线程等待 ta线程结束才继续执行  
    print('main thread over')  

4.isAlive()方法

这个方法用于判断线程是否运行。

1.当线程未调用 start()来开启时,isAlive()会返回False

2.但线程已经执行后并结束时,isAlive()也会返回False

[python] view plain copy

import threading  
import time  
class mythread(threading.Thread):  
    def run(self):  
       time.sleep(2)  

if __name__ == '__main__':  
    ta = mythread()     #实例化线程  
    print(ta.isAlive())   #打印False,因为未执行 start()来使ta线程运行  
    ta.start()  
    print(ta.isAlive())   #打印Ture,因为ta线程运行了  
    time.sleep(3)  
    print(ta.isAlive())   #打印False,因为ta线程已经结束了  
  1. name属性和daemon属性

1.name属性表示线程的线程名 默认是 Thread-x x是序号,由1开始,第一个创建的线程名字就是 Thread-1

[python] view plain copy

import threading  
import time  
class mythread(threading.Thread):  
    def run(self):  
        pass  

if __name__ == '__main__':  
    ta = mythread()     #实例化线程  
    ta.name = 'thread-ta'  
    tb = mythread()  
    tb.start()  
    ta.start()  

    print(ta.name)  #打印 thread-ta  
    print(tb.name)  #打印 Thread-2  

2.daemon属性用来设置线程是否随主线程退出而退出

当 daemon = False 时,线程不会随主线程退出而退出(默认时,就是 daemon = False)

当 daemon = True 时,当主线程结束,其他子线程就会被强制结束

[python] view plain copy

import threading  
import time  
class mythread(threading.Thread):  
    def run(self):  
        time.sleep(2)  
        print('my thread over')  

def main():  
    ta = mythread()  
    ta.daemon = True  
    ta.start()  
    print('main thread over')  

if __name__ == '__main__':  
    main()  
#打印结果 :main thread over   然后马上结束程序  

6.线程的同步---锁
当一个进程拥有多个线程之后,如果他们各做各的任务互没有关系还行,但既然属于同一个进程,他们之间总是具有一定关系的。比如多个线程都要对某个数据进行修改,则可能会出现不可预料的结果。为保证操作正确,就需要引入锁来进行线程间的同步。

python3 中的 threading 模块提供了 RLock锁(可重入锁)。对于某一时间只能让一个线程操作的语句放到 RLock的acquire 方法 和 release方法之间。即 acquire()方法相当于给RLock 锁 上锁,而 release() 相当于解锁。

[python] view plain copy

import threading  
import time  

class mythread(threading.Thread):  
    def run(self):  
        global x            #声明一个全局变量  
        lock.acquire()      #上锁,acquire()和release()之间的语句一次只能有一个线程进入,其余线程在acquire()处等待  
        x += 10  
        print('%s:%d'%(self.name,x))  
        lock.release()      #解锁  

x = 0  
lock = threading.RLock()    #创建 可重入锁  
def main():  
    l = []  
    for i in range(5):  
        l.append(mythread())    #创建 5 个线程,并把他们放到一个列表中  
    for i in l:  
        i.start()               #开启列表中的所有线程  

if __name__ =='__main__':  
    main()  

打印结果:

Thread-1:10
Thread-2:20
Thread-3:30
Thread-4:40
Thread-5:50

7.线程的同步---Event对象
Event对象存在于 threading 模块中。Event 实例管理着 一个内部标志,通过 set() 方法来将该标志设置成 True,使用 clear() 方法将该标志重置成 False

wait() 方法会使当前线程阻塞直到标志被设置成 True,wait()可以选择给他一个参数,代表时间,代表阻塞多长时间,若不设置就是阻塞直到标志被设置为True

isSet()方法 :能判断标志位是否被设置为True

[python] view plain copy

import threading  
import time  

class Mon(threading.Thread):  
    def run(self):  
        Dinner.clear()  
        print('Cooking dinner')  
        time.sleep(3)  
        Dinner.set()    #标志设置为True  
        print(self.name,':dinner is OK!')  

class Son(threading.Thread):  
    def run(self):  
        while True:  
            if Dinner.isSet():  #判断标志位是否被设置为True  
                break  
            else:  
                print('dinner isnot ready!')  
                Dinner.wait(1)  

        print(self.name,':Eating Dinner')  

def main():  
    mon = Mon()  
    son = Son()  
    mon.name = 'Mon'  
    son.name = 'Son'  
    mon.start()  
    son.start()  

if __name__ == '__main__':  
    Dinner = threading.Event()  
    main()  

''''' 
Cooking dinner 
dinner isnot ready! 
dinner isnot ready! 
dinner isnot ready! 
Mon :dinner is OK! 
Son :Eating Dinner 
'''  

8.线程的同步---Condition条件变量

条件变量表示当线程满足某一个 条件才被唤醒,否则一直阻塞

对比 只用锁不用条件变量 的好处就是:只用锁的话,如果一个线程在上锁后,解锁前,因为某一条件一直阻塞着,那么锁就一直解不开,那么其他线程也就因为一直获取不了锁而跟着阻塞着,这样效率就不好,浪费了很多时间。对于这种情况,锁+条件变量可以让该线程先 解锁,然后阻塞着,等待条件满足了,再重新唤醒并获取锁(上锁)。这样就不会因为一个线程阻塞着而影响其他线程也跟着阻塞了。

Condition 提供的方法:

acquire() 和 release() 表示上锁和解锁,和 单纯的锁机制一样。

wait() 解开锁,阻塞,直到其他线程调用了notify()或者notifyAll才被唤醒,注意,这里的wait()跟上面Event提到的wait()不是同一样东西

notify() 发出资源可用的信号,唤醒任意一条因 wait()阻塞的进程

notifyAll() 发出资源可用信号,唤醒所有因wait()阻塞的进程

下面给出一个例子,一家蛋糕店:只会做一个蛋糕,卖出后才会再做一个。绝对不会做积累到2个蛋糕。

[python] view plain copy

import threading  
import time  

class Server(threading.Thread):  
    def run(self):  
        global x  
        while True:  
            con.acquire()  
            while x>0:  
                con.wait()  
            x += 1  
            time.sleep(1)  
            print(self.name,':I make %d cake!'%(x))  
            con.notifyAll()  
            con.release()  

class Client(threading.Thread):  
    def run(self):  
        global x  
        con.acquire()  
        while x == 0:  
            con.wait()  
        x-=1  
        print(self.name,'I bought a cake! the rest is %d cake'%(x))  
        con.notifyAll()  
        con.release()  

def main():  
    ser = Server()  
    ser.name = 'Cake Server'  
    client = []  
    for i in range(3):  
        client.append(Client())  
    ser.start()  
    for c in client:  
        c.start()  

if __name__ =='__main__':  
    x = 0  
    con = threading.Condition()  
    main()  
''''' 
打印结果: 
Cake Server :I make 1 cake! 
Thread-3 I bought a cake! the rest is 0 cake 
Cake Server :I make 1 cake! 
Thread-4 I bought a cake! the rest is 0 cake 
Cake Server :I make 1 cake! 
Thread-2 I bought a cake! the rest is 0 cake 
Cake Server :I make 1 cake! 
'''  

--结束END--

本文标题: python3 多线程编程

本文链接: https://lsjlt.com/news/192873.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • python3 多线程编程
    0.什么是线程 多线程模块 创建线程的方法 join()方法 4.isAlive()方法 name属性和daemon属性 6.线程的同步---锁 7.线程的同步---Event对象 8.线程的同步---Condition条件...
    99+
    2023-01-31
    多线程
  • Python3 多线程
    两个概念: 并发:假同时,一段时间内同时处理多个任务,单核都可以; 并行:真同时,同时处理多个任务,必须多核。 主流操作系统上完成并发的手段有进程和线程,主流的编程语言提供了用户空间的调度:协程。Python 也不例外。 (想自学习编...
    99+
    2023-01-31
    多线程
  • python3 - 多线程 - thre
    目录 一、threading 模块:对线程的处理 二、Thread组件 2-1 开启线程的方式一(函数) 2-2 开启线程的方式二 (类) 2-3 Thread 相关内置子方法  2-4 主进程等待新建线程实例 2-5 线程共用创造进程内...
    99+
    2023-01-31
    多线程 thre
  • Python3多线程详解
    目录为什么要使用多线程?如何创建和执行一个线程方法一正式介绍threading模块守护线程 Daemon方法一方法二让主线程等待子线程结束 join线程共享资源可能引起什么问题?竞态...
    99+
    2023-05-19
    Python3多线程 Python3线程
  • Python3 多线程讲解
    前言 Python3 线程中常用的两个模块为•_thread•threading(推荐使用) thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用”thread” 模块。为了兼容性,...
    99+
    2023-01-31
    多线程
  • python3 queue多线程通信
    目录queue分类例子一、生产消费模式例子二、task_done和join例子三、多线程里用queuequeue分类 python3 queue分三类: 先进先出队列后进先出的栈优先...
    99+
    2024-04-02
  • Python多线程编程,线程锁
    多线程threading 模块创建线程创建自己的线程类线程通信线程同步互斥方法线程锁@需要了解!!!   什么是线程? 线程也是一种多任务的编程方法,可以利用计算机多核资源完成程序的并发运行。 线程又被称为轻量级进程 ...
    99+
    2023-01-30
    线程 多线程 Python
  • Java 多线程编程
    Java 多线程编程   目录 Java 多线程编程 一个线程的生命周 线程的优先级 创建一个线程 通过实现Runnable接口来创建线程 实例 通过继承Thread来创建线程 实例 Thread 方法 实例   线程的几个主要概念: 多线...
    99+
    2023-10-20
    python 开发语言
  • python 多线程编程
    使用回调方式 import time def countdown(n): while n > 0: print('T-minus', n) n -= 1 time.sleep...
    99+
    2023-01-31
    多线程 python
  • Python多线程编程
      一个串行程序需要从每个I/O终端通道来检测用户的输入,然而程序在读取过程中不能阻塞,因为用户输入的到达时间的不确定,并且阻塞会妨碍其他I/O通道的处理。由于串行程序只有唯一的执行线程,因此它需要兼顾执行的多个任务,确保其中的某个任务不会...
    99+
    2023-01-31
    多线程 Python
  • python多线程socket编程--多
    Python中实现socket通信的服务端比较复杂,而客户端非常简单,所以客户端基本上都是用sockct模块实现,而服务 端用有很多模块可以使用,如下: 1、客户端 #!/usr/bin/env python #coding...
    99+
    2023-01-31
    多线程 python socket
  • 多线程编程(3):线程池ThreadPo
    在面向对象编程中,经常会面对创建对象和销毁对象的情况,如果不正确处理的话,在短时间内创建大量对象然后执行简单处理之后又要销毁这些刚刚建立的对象,这是一个非常消耗性能的低效行为,所以很多面向对象语言中在内部使用对象池来处理这种情况,以提高性能...
    99+
    2023-01-31
    线程 多线程 ThreadPo
  • Python3 异步编程之进程与线程-1
    Python3 异步编程之进程与线程-1一、了解进程间通信进程间通信进程线程线程 vs 进程IO模型并发 vs 并行异步 vs 同步二、多线程与多进程的用法计算密集型 vs I/O密集型GIL多线程多进程三、协程的好处与用法协程yieldy...
    99+
    2023-01-31
    线程 进程
  • python并发编程之多线程编程
    一、threading模块介绍 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 二、开启线程的两种方式 方式一: from threading import ...
    99+
    2023-01-31
    之多 线程 python
  • C++多线程编程详解
    目录C++多线程1. 概念1.1 概念2. 常用API1.thread2.互斥锁mutex3. 挂起和唤醒3. 应用场景3.1 call_once执行一次的函数3.2 conditi...
    99+
    2024-04-02
  • java多线程编程之InheritableThreadLocal
    InheritableThreadLocal的作用: 当我们需要在子线程中使用父线程中的值得时候我们就可以像使用ThreadLocal那样来使用InheritableThreadLocal了。 首先我们来看一下InheritableThre...
    99+
    2023-05-31
    java 多线程 inheritablethreadlocal
  • Python多线程编程实例
    Python多线程编程 发布者:lanyulei,转载请注明出处:http://www.fdevops.com/p=517 下面多线程模块threading的方法注释,均来自于百度贴吧"学点编程吧"。 Thread: 表示一个线程的执行对象...
    99+
    2023-01-31
    多线程 实例 Python
  • java多线程编程实例
    以下是一个简单的Java多线程编程实例:```javapublic class MultiThreadExample impleme...
    99+
    2023-08-16
    Java
  • python3进程和线程
    进程基本概念 进程是执行中的程序, 也就是说进程是动态的, 程序是静态的 进程是操作系统分配资源的最小单位,有一个进程控制块(PCB), 有自己唯一的一个进程标识符(PID) 进程之间相互独立, 内存不共享 每个进程都是一个实体, ...
    99+
    2023-01-31
    线程 进程
  • python3-001-多线程简单聊天室
            这次代码为python3编写,并且使用网络调试助手、与python3聊天室程序进行通信测试。1、先放干货代码,如下: 1 from socket import * 2 from threading import Th...
    99+
    2023-01-31
    多线程 聊天室 简单
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作