前言
在当今快速发展的互联网时代,高效率的程序执行变得尤为重要。Python作为一种广泛使用的编程语言,其多线程并发编程功能能够显著提高程序的执行效率。本文将带你轻松入门Python多线程并发编程,并展示如何高效实现。
学前须知
在开始学习之前,你需要具备以下基础:
- Python基础语法
- Python文件操作
- Python模块应用
开发工具
推荐使用PyCharm作为开发工具,它具有强大的代码编辑和调试功能。
课程安排
- 进程实现多任务
- 线程实现多任务
- 多任务应用
一、多任务介绍
1.1 多任务的概念
多任务是指在同一时间内执行多个任务。
1.2 多任务的两种表现形式
- 并发:在一段时间内交替去执行多个任务。
- 并行:在一段时间内真正的同时一起执行多个任务。
1.3 并发
例子:对于单核CPU处理多任务,操作系统轮流让各个任务交替执行。
1.4 并行
例子:对于多核CPU处理多任务,操作系统会给CPU的每个内核安排一个执行的任务,多个内核是真正的一起同时执行多个任务。
二、线程的介绍
线程是一个独立的执行流程,每个线程都有自己的堆栈空间和程序计数器,它们同时运行,但不一定按照顺序执行。
三、多线程实现多任务
3.1 线程的创建步骤
import threading
def printtime(threadName, delay):
count = 0
while count < 5:
time.sleep(delay)
count += 1
print("%s: %s" % (threadName, time.ctime(time.time())))
try:
thread1 = threading.Thread(target=printtime, args=("Thread-1", 2,))
thread2 = threading.Thread(target=printtime, args=("Thread-2", 4,))
except:
print("Error: 无法启动线程")
thread1.start()
thread2.start()
thread1.join()
thread2.join()
3.2 线程执行带有参数的任务
def worker(name, delay):
print(f"线程 {name} 开始")
time.sleep(delay)
print(f"线程 {name} 完成")
thread1 = threading.Thread(target=worker, args=("Thread-1", 2,))
thread2 = threading.Thread(target=worker, args=("Thread-2", 4,))
thread1.start()
thread2.start()
thread1.join()
thread2.join()
3.3 主线程和子线程的结束顺序
- 主线程会等待所有的子线程完成才结束。
- 设置守护主线程:只有所有守护线程都结束,整个Python程序才会退出。
四、线程间的执行顺序
4.1 线程间的执行是无序的
4.2 例子
import threading
def print_numbers():
for i in range(5):
print("数字", i)
thread1 = threading.Thread(target=print_numbers)
thread2 = threading.Thread(target=print_numbers)
thread1.start()
thread2.start()
thread1.join()
thread2.join()
五、多线程-案例
5.1 需求分析
编写一个简单的网络爬虫,使用多线程同时爬取多个网页。
5.2 实现
import threading
import requests
def crawl(url):
response = requests.get(url)
print(f"爬取 {url} 成功")
urls = [
"http://www.example.com",
"http://www.example.org",
"http://www.example.net"
]
threads = []
for url in urls:
thread = threading.Thread(target=crawl, args=(url,))
threads.append(thread)
thread.start()
for thread in threads:
thread.join()
六、进程和线程对比
6.1 关系对比
- 进程是线程的容器。
- 一个进程可以包含多个线程。
6.2 区别对比
- 进程是系统进行资源分配的最小单位,而线程是进程执行程序时的最小调度单位。
- 进程有自己独立的内存空间,而线程共享进程的内存空间。
6.3 优缺点对比
- 进程:优点是资源独立,缺点是创建和切换开销大。
- 线程:优点是创建和切换开销小,缺点是资源共享,存在竞争问题。
七、总结
通过本文的学习,相信你已经掌握了Python多线程并发编程的基本知识和技能。在实际应用中,合理运用多线程技术可以显著提高程序的执行效率。希望本文能帮助你轻松入门Python多线程并发编程,并在实践中不断提高自己的技能。