当前位置:   article > 正文

python多线程技术(Threading)_threading python

threading python


前言

多线程技术可以帮助我们加速python的工作效率。看本文前建议先看python传参这篇文章,有一点小小的知识点需要知道才好理解lock功能哪里的维护共享内存的安全性。

一、多线程(Threading)是什么?

多线程是什么我也问过chatgpt,但是同样是给出了一种摸棱两可的官方语言,看不懂。这里就我个人的理解来讲讲什么是多线程。其实多线程用一个实际中的例子就很好理解了,假设现实中有一份工作,一个人做完成所花费的时间太长,作为老板的你受不了了,怎么办呢?请人,多找几个打工仔不就可以缩短了时间。这就是一个典型的多线程,每个打工仔就是一个线程。下面回到计算机中,有一份很大的数据,你嫌弃python处理的太慢了,于是你将这份很大的数据拆分成5个小数据,然后分配5个进程让python同时处理这5份小数据,理论上速度一下就提升了5倍。这就是多线程,简单理解就是让python在同一时间可以干多件事情。可以在同一个时间内运行多个程序,但是还是在同一个脚本中,这就是python多线程。
【注】:但是python里面多线程其实本质上是一个假的多线程,的确是在同一时间干多件事情,但是它是在不断的反复切换线程来实现的,所以从理论上来说速度是不会有加快的(应该是时间差不多,或者快一点)。但是同一个时间干多件事情这个功能还是要经常用到的,所以不要想着用python多线程加速了,能让你在同一时间干不同的事情已经够不错了。
如果需要加速需要使用多进程功能,后面博客里面会写,在这里加上链接。

二、threading库

下面演示怎么使用threading使用python多线程功能

1.初识多线程

function 功能
threading.active_count() 返回当前活动的线程数
threading.enumerate() 返回当前活动的线程列表
threading.current_thread() 返回当前线程对象
import threading
def main():
    print(threading.active_count())  # 返回当前活动的线程数
    print(threading.enumerate())     # 返回当前活动的线程列表
    print(threading.current_thread())   # 返回当前线程对象

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

输出:
在这里插入图片描述
可以看到,目前显示有6个线程在运行中,其中画线的main就是我们mian函数运行的线程,并且可以看到当前正在运行的线程对象就是我们刚定义的main函数。线程对象列表里面其他几个线程不用管,应该是编辑器或者环境开启就有了的。
这么一看,我们可以将一个线程绑定一个python里面某个功能的主函数,那个这个线程就会干那个主函数干的活了。

2.增加新线程

可以看到上面main函数还是在一个脚本里面干一件事啊,如果要同时干第二件事怎么办,那就要添加新线程,并将其绑定到我们需要干的另一个主函数上,下面继续演示。

2.1 多线程的基本使用

import threading
def main():
    add_thread = threading.Thread(target=another_main, name='thread2')    # 创建线程,并于another_main函数绑定
    add_thread.start()  # 启动线程
    print(threading.active_count())  # 返回当前活动的线程数
    print(threading.enumerate())     # 返回当前活动的线程列表
    print(threading.current_thread())   # 返回当前线程对象
    
def another_main():
	# 定义另一件事情
    print('-------another_main---------')
    while True:
        # while循环是为了让线程一直运行,不然线程会自动结束,便于观察线程的状态
        a=1 

if __name__ == '__main__':
    main()      
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

输出:
在这里插入图片描述
可以看到输出了another_main干的事情,线程数由6变成了7,并且线程列表里面增加了名为thread2的新线程。
实现了在做main里面的事情的同时还在做another_main的事情。
【注】:这和在main里面直接调another_main不一样,直接调这两件事情是有一个先后顺序的,是在共用一个线程;但如果是another_main绑定上一个新线程,那么这两件事情就是平级关系,同时在干。

有没有发现上面演示的没有穿参数进去,如果要传参又应该怎么办呢!python里面传函数是不能带括号()的,似乎麻烦了。放心了,怎么可能开发者没有想到这一点呢,在给一个参数传参数不就可以了,嘿嘿!

import threading

def main():
    # 创建线程并传递字符串和数字参数
    thread = threading.Thread(target=another_main, args=('Hello', 123))
    thread.start()
    print("Main thread is done!")

def another_main(string_param, int_param):
    # 打印接收到的参数
    print("Received string parameter:", string_param)
    print("Received integer parameter:", int_param) 

if __name__ == '__main__':
    main()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出:
在这里插入图片描述

2.2 对多线程是同时进行的进行一个直观上的演示(非重点–理解是实时就行)

上面由于another_main功能几乎是瞬时完成的,根本显示不出来这个同时性,反而像是直接调用打印一样。所以这里用time库进行一个直观上的演示。

import threading
import time

def main():
    # 创建线程并传递字符串和数字参数
    thread = threading.Thread(target=another_main)
    thread.start()
    print("Main thread is done!")

def another_main():
    print('新thread started') # 打印线程开始
    for i in range(10):
        time.sleep(0.1)  # 暂停0.1秒后再继续运行
    print('新thread stop') # 打印线程结束

if __name__ == '__main__':
    main() 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

输出:(这里建议去终端运行效果更好)
在这里插入图片描述
可以看到"Main thread is done!"并不是最后才输出,这就说明不是直接调,而是两个工作在同时做,没有先后顺序。

2.3 thread.join()功能

有时我们想要等到我们添加了的新线程完全结束才运行主mian中thread.start()后面的代码·(此时有先后了),就要用到
thread.join()
【注】:thread.join()还有一个非常重要的功能,阻塞主线程,防止主线程跑完了,子线程1,2等还没跑完。这警告我们写多线程对每一个子线程进行thread.join()是必不可少的。

import threading
import time

  • 1
  • 2
  • 3
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号