Python多线程

一、介绍

  1. 什么是进程
    程序在操作系统内运行,即成为一个运行进程
  2. 什么是线程
    进程内部可以有多个线程,程序的运行本质就是由进程内部的线程在实际工作
  3. 什么是并行执行
    多个进程同时在运行,即不同的程序同时运行,称之为多任务并行执行
    一个进程内的多个线程同时在运行,称之为多线程并行执行
    在这里插入图片描述

多线程是指在同一进程内同时执行多个线程的技术。每个线程独立执行不同的任务,但共享相同的内存空间。Python的多线程通过threading模块来实现,允许创建、启动和控制线程的执行。

二、Python多线程代码示例

当使用Python的多线程编程时,start()join()是非常常用的方法,用于控制线程的启动和等待。

1.start方法

  • start(): start()方法用于启动线程,使其开始执行。一旦调用了start()方法,线程对象将会被放入就绪队列中,等待系统调度执行。注意,start()方法只能在每个线程对象上调用一次,重复调用会引发RuntimeError异常。

下面是一个示例,展示如何使用start()方法启动线程:

import threading

def task():
    print("Executing task")

t = threading.Thread(target=task)
t.start()

2.join方法

  • join(): join()方法用于等待线程执行完毕。调用了join()方法后,当前线程将会阻塞,直到被调用的线程执行完成。这对于需要等待其他线程执行完毕后再继续执行的情况非常有用。

下面是一个示例,展示了如何使用join()方法等待线程执行完毕:

import threading

def task():
    print("Executing task")

t = threading.Thread(target=task)
t.start()

# 等待线程执行完毕
t.join()

print("All tasks are completed")

在这个示例中,主线程通过调用t.join()方法等待t线程执行完毕后再继续执行。
在Python的time模块中,sleep()方法用于让当前线程暂停执行一段时间。这个方法接受一个参数,表示要暂停的秒数。

3.sleep方法

import time

time.sleep(seconds)
  • seconds: 表示暂停的时间,可以是小数。

下面是一个示例,展示了如何使用sleep()方法来让线程暂停执行一段时间:

import time

print("Start")
time.sleep(2)  # 暂停2秒
print("After 2 seconds")

在这个示例中,程序会输出"Start"后暂停2秒钟,然后再输出"After 2 seconds"。

sleep()方法通常用于模拟延迟或等待,或者在需要控制线程执行速度时使用。

4.整体示例

import threading
import time

def task(name):
    for _ in range(3):
        time.sleep(1)
        print(f"Executing task {name}")

# 创建线程
t1 = threading.Thread(target=task, args=("A",))
t2 = threading.Thread(target=task, args=("B",))

# 启动线程
t1.start()
t2.start()

# 等待线程结束
t1.join()
t2.join()

print("All tasks are completed")

三、线程方法参数及含义

在Python的threading.Thread类中,有一些常用的方法参数及其含义如下:

  • target:表示要执行的函数或方法
  • args:表示传递给target函数的参数,它是一个元组形式
  • kwargs:表示传递给target函数的关键字参数,它是一个字典形式

下面是一个示例来展示kwargs参数的使用:

import threading

def print_info(name, age):
    print(f"Name: {name}, Age: {age}")

info = {"name": "Alice", "age": 25}
t = threading.Thread(target=print_info, kwargs=info)
t.start()
t.join()

四、使用场景及代码示例

1.下载示例

import threading
import requests

def download_file(url):
    response = requests.get(url)
    with open('downloaded_file', 'wb') as file:
        file.write(response.content)

url1 = "http://www.example.com/file1"
url2 = "http://www.example.com/file2"

t1 = threading.Thread(target=download_file, args=(url1,))
t2 = threading.Thread(target=download_file, args=(url2,))

t1.start()
t2.start()

t1.join()
t2.join()

print("All files have been downloaded")

输出:

All files have been downloaded

2.其他示例

import threading

def sing(msg):
    while True:
        print(f"唱歌测试~~~~~{msg}")

def dance(msg):
    while True:
        print(f"跳舞测试!!!!!{msg}")

if __name__=="__main__":
    threading.Thread(target=sing,args=("啦啦啦啦",)).start()
    threading.Thread(target=dance,kwargs={"msg":"~~~~~~"}).start()

输出:

唱歌测试~~~~~啦啦啦啦
跳舞测试!!!!!~~~~~~
唱歌测试~~~~~啦啦啦啦
唱歌测试~~~~~啦啦啦啦

唱歌测试~~~~~啦啦啦啦跳舞测试!!!!!~~~~~~

唱歌测试~~~~~啦啦啦啦跳舞测试!!!!!~~~~~~

唱歌测试~~~~~啦啦啦啦跳舞测试!!!!!~~~~~~
……

五、总结

Python多线程通过threading模块提供了创建和控制线程的功能,适用于处理I/O密集型任务和GUI应用程序的并发需求。然而,对于CPU密集型任务,并不能实现真正的并行加速。因此,在选择多线程或多进程时,需要根据具体任务的特点来进行合理选择,充分发挥多线程的优势。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陈年小趴菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值