一、介绍
- 什么是进程
程序在操作系统内运行,即成为一个运行进程 - 什么是线程
进程内部可以有多个线程,程序的运行本质就是由进程内部的线程在实际工作 - 什么是并行执行
多个进程同时在运行,即不同的程序同时运行,称之为多任务并行执行
一个进程内的多个线程同时在运行,称之为多线程并行执行
多线程是指在同一进程内同时执行多个线程的技术。每个线程独立执行不同的任务,但共享相同的内存空间。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密集型任务,并不能实现真正的并行加速。因此,在选择多线程或多进程时,需要根据具体任务的特点来进行合理选择,充分发挥多线程的优势。