深入理解 Python 中的多线程
本文主要介绍 Python 中的多线程编程相关知识,内容涉及如下:
- 什么是多线程
- Python 中的线程模块
- Python 中的 GIL 问题
- Python 中的多线程编程示例
什么是多线程
多线程是指同时执行多个线程,例如 Word 中同时打字和拼写检查。多线程可以提高程序的性能和响应速度,因为线程可以在程序等待 IO 操作的时候继续执行其他的线程。
Python 中的线程模块
Python 中的 threading 模块提供了多线程编程的相关功能,通过创建 Thread 类的实例对象即可创建新的线程。
示例1:创建新的线程
import threading
def print_it():
for i in range(5):
print(i)
t = threading.Thread(target=print_it)
t.start()
t.join()
print('Done')
示例2:通过继承 Thread 类的方式创建新的线程
import threading
class MyThread(threading.Thread):
def run(self):
for i in range(5):
print(i)
t = MyThread()
t.start()
t.join()
print('Done')
Python 中的 GIL 问题
GIL(全局解释器锁)是 Python 解释器中的一个机制,它保证同一时刻只有一个线程可以执行 Python 代码。
虽然 GIL 可以避免 Python 的内存管理问题,保证 Python 程序不会发生 race condition 和 deadlocks,但是也会降低多线程程序的性能。
Python 中的多线程编程示例
示例3:多线程下载图片
import requests
import time
import threading
def download(url):
start = time.time()
response = requests.get(url)
with open(f'{url.split("/")[-1]}', 'wb') as f:
f.write(response.content)
end = time.time()
print(f'{url.split("/")[-1]} downloaded, time: {end-start:.2f}s')
if __name__ == '__main__':
urls = ['http://image1.png', 'http://image2.png', 'http://image3.png']
thread_list = []
for url in urls:
t = threading.Thread(target=download, args=(url,))
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
print('All done')
示例4:多线程爬取网页
import requests
import time
import threading
from bs4 import BeautifulSoup
def crawl(url):
start = time.time()
response = requests.get(url)
soup = BeautifulSoup(response.text, 'html.parser')
content = soup.find('div', class_='post-content')
print(content.text)
end = time.time()
print(f'{url} crawled, time: {end-start:.2f}s')
if __name__ == '__main__':
urls = ['http://example.com/page1', 'http://example.com/page2', 'http://example.com/page3']
thread_list = []
for url in urls:
t = threading.Thread(target=crawl, args=(url,))
t.start()
thread_list.append(t)
for t in thread_list:
t.join()
print('All done')
通过上述示例可以了解 Python 中多线程编程的基本概念和应用场景。同时需要注意的是,多线程编程还存在着一些问题,例如线程安全、死锁等,需要在实际编程中进行处理。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解 Python 中的多线程 新手必看 - Python技术站