python-多线程

 

首先了解多线程之前先科普一下并发以及并行的概念,这两者大家很容易混淆.

 

  一,意思不同

  1、并发:并发是指两个或多个事件在同一时间间隔发生。

  2、并行:并行是指两个或者多个事件在同一时刻发生。

  二,处理方式不同

  1、并发:并发在一台处理器上同时处理多个任务。

  2、并行:并行在多台处理器上同时处理多个任务。

  三,python 不能处理并行只能处理并发场景

  在跑python代码时我们可以开很多个线程让他们并发执行,但是这个并发只能在该进程被分配的CPU上运行也就是说只能有一个CPU在跑这个线程。

  这是因为python有一个全局解释器锁GIL。每个线程都要先取得这个锁才能被CPU调用运行,那么,什么是 GIL 呢?GIL 是最流程的 CPython 解释器

  (平常称为 Python)中的一个技术术语,中文译为全局解释器锁,其本质上类似操作系统的 Mutex。GIL 的功能是:在 CPython 解释器中执行的每

  一个 Python 线程,都会先锁住自己,以阻止别的线程执行。

 

python 多线程:

  线程是CPU分配资源的基本单位。当一程序开始运行,这个程序就变成了一个进程,而一个进程相当于一个或者多个线程,程序的运行速度可能加快

  多线程的创建方式:

  1.from threading import Thread :通过导入threading 模块中的Thread 类创建

  2.threading.Thread :可以通过类的继承方式进行创建

  Thread创建线程的初始化参数:
1.target:指定线程执行的任务函数
2.name: 给线程起的名字 (默认的线程命名:Thread-1,Thread-2....)
3.daemon: 是否设置为守护线程
守护线程:主线程(主程序)执行结束,不管线程中的任务是否执行完毕 强制关闭线程
4.args:给任务函数传参 (位置参数)
5.kwargs:给任务函数传参(关键字参数)

 
  Thread内置方法: 

      1.starat方法:开始线程活动

                    它在一个线程里最多只能被调用一次。它安排对象的 run() 方法在一个独立的控制进程中调用。如果同一个线程对象中调用这个方法的次数大于一次,

      会抛出 RuntimeError 。

         2.run方法:

      代表线程活动的方法。

      你可以在子类型里重载这个方法。 标准的 run() 方法会对作为 target 参数传递给该对象构造器的可调用对象(如果存在)发起调用,并附带从 args 和 

      kwargs 参数分别获取的位置和关键字参数。

      3.join方法: 线程等待的方法

      join(timeout=None)

      等待,直到线程终结。这会阻塞调用这个方法的线程,直到被调用 join() 的线程终结 -- 不管是正常终结还是抛出未处理异常 -- 或者直到发生超时,超时

                选项是可选的。

     


一,通过第一种方式实现多线程任务执行
实例:不使用多线程执行任务,所有事物处理花费的时间总共11秒左右处理完毕
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# 新建两个任务,我们看下两个运行完成所需要花费的时间
def work(name):
    for i in range(5):
        print(f"{name}------正在做事情1------")
        time.sleep(1)
 
 
def task2(name):
    for i in range(6):
        print(f"{name}-----正在做事情2------")
        time.sleep(1)
 
start_time = time.time()
work("张三")
work1("李四")
end_time = time.time()
print("===============运行结束================")
print(end_time - start_time)
 
=====================运行结果========================
张三------正在做事情1------
张三------正在做事情1------
张三------正在做事情1------
张三------正在做事情1------
张三------正在做事情1------
李四-----正在做事情2------
李四-----正在做事情2------
李四-----正在做事情2------
李四-----正在做事情2------
李四-----正在做事情2------
李四-----正在做事情2------
===================运行结束======================
11.03499460220337

  

 例: 使用多线程执行任务,本身单任务的执行方法,两条任务执行完成的时间11秒多,但是多线程的模式可以最多6秒钟执行完毕,

  每条线程执行不同的任务.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# ===========通过多线程实现多任务运行的模式================
 
def work(name):
    for i in range(5):
        print(f"{name}------正在做事情1------")
        time.sleep(1)
 
 
def work1(name):
    for i in range(6):
        print(f"{name}-----正在做事情2------")
        time.sleep(1)a = Thread(target=work,args=("张三",))
b = Thread(target=work1,kwargs={"name":"李四"})start_time = time.time()a.start()<br>b.start()<br>b.join() # 设置子线程等待,等子线程执行完成之后执行主线程end_time = time.time()<br>print(f"运行时间 : {end_start - start_time}")<br>
===================输出结果========================
张三------正在做事情1------
李四-----正在做事情2------
张三------正在做事情1------李四-----正在做事情2------
 
张三------正在做事情1------李四-----正在做事情2------
 
张三------正在做事情1------李四-----正在做事情2------
 
李四-----正在做事情2------张三------正在做事情1------
 
李四-----正在做事情2------<br><br>运行时间 : 6.039487600326538

  

 

二,通过第二种继承的方式实现多线程执行,run方法是Thread里面的任务执行方法,可以通过在子类从写父类的run的执行任务.

复制代码
"=======通过继承父类的方式实现多线程==============="

class Test(Thread):

    def run(self):
        for i in range(6):
            print("执行工作1")

a = Test()
b = Test()
a.start()
b.start()

"=================输出结果=================="
执行工作1
执行工作1
执行工作1
执行工作1
执行工作1
执行工作1
执行工作1
执行工作1
执行工作1
执行工作1
执行工作1
执行工作1
复制代码

 

 


 

posted @   多测师-星sir  阅读(136)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示