编程小白的自学笔记八(python中的多线程)

简介: 编程小白的自学笔记八(python中的多线程)

前言

Python 多线程是指在一个进程中同时执行多个线程,从而实现并发执行。对于初学者来说,理解起来有难度,我们先来看看怎么用吧,先熟悉,后期在实际中再掌握。


一、创建线程

进程大家都知道,一般打开任务管理器,一个程序对应一个进程,当然也有一个程序对应好几个进程的,线程是比进程更小的单位,比如把抖音看作一个进程,视频播放是一个线程,同时还可以打赏和评论,打赏是一个线程,评论是一个线程。这些线程是可以同时进行的,至少看起来是这样。


在python中,多线程只允许同一时刻只有一个线程在执行,多个线程交替运行,看起来就好像同时在运行一样,这就是并发。下面我们用代码来模拟下:

import threading
def test(x,y):
    for i in range(x,y):
        print(i)
x1 = threading.Thread(name='t1',target=test,args=(0,10))
x2 = threading.Thread(name='t2',target=test,args=(10,20))
x1.start()
x2.start()

这里我们需要调用threading模块,通过threading.Thread我们就可以创建线程,这时我们就有x1和x2两个线程了。


二、线程的并发

按照以前的程序运行逻辑,应该是运行完x1,再运行x2,也就是运行结果应该是0到19顺序输出,而实际的输出结果为:


0

1

2

3

410

511

612

713

814

915

16

17

18

19


而且当我再次运行程序时,结果又发生了变化,结果为:


0

1

2

3

4

5

10

11

612

7

8

139

14

15

16

17

18

19


可以看出,程序并不是运行完一个线程在运行另一个,而是随机交叉运行,这就是python的多线程。


三、threading.Thread () 函数


threading.Thread ()里面有很多参数,主要是我们上面所使用的三个,name参数是给线程命名,如果不写,默认为Tread-1,第二个线程就是Tread-2,以此类推。


target参数可以看出来,传进去的是函数名,也就是说是这个线程准备调用的函数。


我们发现args参数的值实际上是传给了test函数,也就是说,args的值传给了线程调用的函数。



以下是一些常用的 threading.Thread() 方法:

  • target:指定线程要执行的任务函数。
  • args:传递给任务函数的位置参数。
  • kwargs:传递给任务函数的关键字参数。
  • name:设置线程的名称。
  • daemon:设置线程是否为守护线程,如果是守护线程,则主程序退出时会自动销毁该线程。

四、join方法

如果子线程调用join方法,会引起主线程阻塞,通俗来说就是子线程执行完了,才会执行主线程,我们来试一下:

import threading
def test(x,y):
    for i in range(x,y):
        print(i)
x1 = threading.Thread(name='t1',target=test,args=(0,10))
x2 = threading.Thread(name='t2',target=test,args=(10,20))
x1.start()
x1.join()
x2.start()

我们在启动x1线程后,启动join方法。我们会发现,无论我们重新运行几次代码,输出的结果都是0-19顺序输出,也就是说执行完x1后,再执行x2。


总之,threading.Thread() 的 join() 方法用于阻塞当前线程,直到调用该方法的线程执行完毕。如果不使用 join() 方法等待线程结束,线程的输出结果有可能会出现线程混乱,即第一个线程开启后还没有运行结束,第二个线程已经开启了,可能会出现第二个线程先输出的情况。使用 join() 时,第一个线程的任务完全结束后,才会开启第二个线程,输出的结果也将是有序的 。  


五、总结

Python 多线程是指在一个进程中同时执行多个线程,从而实现并发执行。在 Python 中,可以使用 threading 模块来创建和管理线程。以下是一些常用的 threading 模块方法:

  • Thread():创建一个线程对象。
  • start():启动线程。
  • join():阻塞当前线程,直到调用该方法的线程执行完毕。
  • is_alive():判断线程是否还在运行。
  • daemon:设置线程是否为守护线程,如果是守护线程,则主程序退出时会自动销毁该线程。
相关文章
|
5月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
244 6
|
6月前
|
数据采集 机器学习/深度学习 人工智能
Python:现代编程的首选语言
Python:现代编程的首选语言
769 102
|
6月前
|
数据采集 机器学习/深度学习 算法框架/工具
Python:现代编程的瑞士军刀
Python:现代编程的瑞士军刀
413 104
|
6月前
|
人工智能 自然语言处理 算法框架/工具
Python:现代编程的首选语言
Python:现代编程的首选语言
331 103
|
6月前
|
机器学习/深度学习 人工智能 数据挖掘
Python:现代编程的首选语言
Python:现代编程的首选语言
271 82
|
5月前
|
Python
Python编程:运算符详解
本文全面详解Python各类运算符,涵盖算术、比较、逻辑、赋值、位、身份、成员运算符及优先级规则,结合实例代码与运行结果,助你深入掌握Python运算符的使用方法与应用场景。
379 3
|
5月前
|
数据处理 Python
Python编程:类型转换与输入输出
本教程介绍Python中输入输出与类型转换的基础知识,涵盖input()和print()的使用,int()、float()等类型转换方法,并通过综合示例演示数据处理、错误处理及格式化输出,助你掌握核心编程技能。
604 3
|
5月前
|
并行计算 安全 计算机视觉
Python多进程编程:用multiprocessing突破GIL限制
Python中GIL限制多线程性能,尤其在CPU密集型任务中。`multiprocessing`模块通过创建独立进程,绕过GIL,实现真正的并行计算。它支持进程池、队列、管道、共享内存和同步机制,适用于科学计算、图像处理等场景。相比多线程,多进程更适合利用多核优势,虽有较高内存开销,但能显著提升性能。合理使用进程池与通信机制,可最大化效率。
415 3
|
5月前
|
设计模式 消息中间件 安全
【JUC】(3)常见的设计模式概念分析与多把锁使用场景!!理解线程状态转换条件!带你深入JUC!!文章全程笔记干货!!
JUC专栏第三篇,带你继续深入JUC! 本篇文章涵盖内容:保护性暂停、生产者与消费者、Park&unPark、线程转换条件、多把锁情况分析、可重入锁、顺序控制 笔记共享!!文章全程干货!
395 1
|
5月前
|
Java 调度 数据库
Python threading模块:多线程编程的实战指南
本文深入讲解Python多线程编程,涵盖threading模块的核心用法:线程创建、生命周期、同步机制(锁、信号量、条件变量)、线程通信(队列)、守护线程与线程池应用。结合实战案例,如多线程下载器,帮助开发者提升程序并发性能,适用于I/O密集型任务处理。
504 0

推荐镜像

更多