「Python入门」Python多线程_python线程学习

本文详细介绍了线程与进程的区别,Python中多线程的直接使用和继承式调用方法,守护线程的概念,join方法的线程同步作用,以及线程锁(互斥锁)的应用。强调了系统学习的重要性以实现技术提升。
摘要由CSDN通过智能技术生成

活动地址:CSDN21天学习挑战赛

文章目录

前言

线程 也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其他线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。
多线程 线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度要小,它们共享内存、文件句柄和其他进程应有的状态。

  • 进程之间不能共享内存,但线程之间共享内存非常容易。
  • 操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此使用多线程来实现多任务并发执行比使用多进程的效率高。
  • python语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了python的多线程编程。

在这里插入图片描述


一、线程与进程的区别

  • 线程共享内存,进程独立内存
  • 线程启动速度块,进程启动速度慢,运行时速度没有可比性
  • 同一个进程的线程间可以直接交流,两个进程想通信,必须通过一个中间代理来实现
  • 创建新线程很简单,创建新进程需要对其父进程进行一次克隆
  • 一个线程可以控制和操作同一线程里的其他线程,但是进程只能操作子进程

二、多线程的使用方式

2.1 直接使用

# 文件名 python1.py
# -\*- coding:utf-8 -\*-
# 线程直接使用
import threading
import time


# 需要多线程运行的函数
def fun(args):
    print("我是线程%s" % args)
    time.sleep(2)
    print("线程%s运行结束" % args)


# 创建线程
t1 = threading.Thread(target=fun, args=(1,))
t2 = threading.Thread(target=fun, args=(2,))
start_time = time.time()
t1.start()
t2.start()
end_time = time.time()
print("两个线程一共的运行时间为:", end_time-start_time)
print("主线程结束")

"""
执行 python python1.py
运行结果:
我是线程1
我是线程2两个线程一共的运行时间为: 0.0019996166229248047
主线程结束

线程1运行结束
线程2运行结束
"""

在这里插入图片描述

2.2 继承式调用

# 文件名 python2.py
# 继承式调用
import threading
import time


class MyThreading(threading.Thread):
    def \_\_init\_\_(self, name):
        super(MyThreading, self).\_\_init\_\_()
        self.name = name

    # 线程要运行的代码
    def run(self):
        print("我是线程%s" % self.name)
        time.sleep(2)
        print("线程%s运行结束" % self.name)


t1 = MyThreading(1)
t2 = MyThreading(2)
start_time = time.time()
t1.start()
t2.start()
end_time = time.time()
print("两个线程一共的运行时间为:", end_time-start_time)
print("主线程结束")

"""
执行 python python2.py
运行结果:
我是线程1
我是线程2
两个线程一共的运行时间为: 0.0010724067687988281
主线程结束
线程2运行结束
线程1运行结束
"""


在这里插入图片描述

三、 守护线程

  • 在Python多线程编程中,join方法的作用式线程同步。
  • 守护线程,是为守护别人而存在的,当设置为守护线程后,被守护的主线程不存在后,守护线程也自然不存在。

Python多线程默认情况(设置线程setDaemon(False)),主线程执行完自己的任务后,就退出了,此时子线程会继续执行自己的任务,直到子线程任务结束
代码演示:threading中的两个创建多线成的例子都是。

# 守护线程
import threading
import time


class MyThreading(threading.Thread):
    def \_\_init\_\_(self, name):
        super(MyThreading, self).\_\_init\_\_()
        self.name = name

    # 线程要运行的代码
    def run(self):
        print("我是线程%s" % self.name)
        time.sleep(2)
        print("线程%s运行结束" % self.name)


t1 = MyThreading(1)
t2 = MyThreading(2)
start_time = time.time()
t1.setDaemon(True)
t1.start()
t2.setDaemon(True)
t2.start()
end_time = time.time()
print("两个线程一共的运行时间为:", end_time-start_time)
print("主线程结束")
"""
执行 python python3.py
后续执行结果以截图的形式呈现,文件名可自定义为xx.py,执行 python xx.py 指令即可.
"""

在这里插入图片描述

四、 join线程同步

当不给程序设置守护进程时,主程序将一直等待子程序全部运行完成才结束

# join:线程同步
import threading
import time


class MyThreading(threading.Thread):
    def \_\_init\_\_(self, name):
        super(MyThreading, self).\_\_init\_\_()
        self.name = name

    # 线程要运行的代码
    def run(self):
        print("我是线程%s" % self.name)
        time.sleep(3)
        print("线程%s运行结束" % self.name)


threading_list = []
start_time = time.time()
for x in range(50):
    t = MyThreading(x)
    t.start()
    threading_list.append(t)

for x in threading_list:
    x.join()    # 为线程开启同步

end_time = time.time()
print("50个线程一共的运行时间为:", end_time-start_time)
print("主线程结束")

在这里插入图片描述

五、 线程锁(互斥锁Mutex)

一个进程下可以启用多个线程,多个线程共享父进程的内存空间,也就意味着每个线程可以访问同一份数据。

# 线程锁(互斥锁Mutex)
# -\*- coding:utf8  -\*-
import threading
import time

num = 100
threading_list = []



![img](https://img-blog.csdnimg.cn/img_convert/db082cc25366abce9dea9cf628ced4aa.png)
![img](https://img-blog.csdnimg.cn/img_convert/1f7840191d68a82e92c4f4052222024e.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

1344)]
[外链图片转存中...(img-J2I94AvU-1714165731345)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值