Python并发编程之线程实例解析
什么是线程?
线程是操作系统能够进行调度的最小单位。它被包含在进程中,是进程中的实际运行单位。每个进程至少有一个线程。使用线程,进程可以在同一时间执行多个不同的任务。
Python中的线程
Python提供了threading
模块来实现多线程编程。该模块提供了Thread
类,可用于创建新的线程,也提供了许多便利的函数和方法,可用于操纵线程。下面是创建线程的基本步骤:
import threading
def my_thread():
# 线程处理逻辑
t = threading.Thread(target=my_thread)
t.start()
以上代码创建了一个新线程,该线程执行函数my_thread()
。线程被创建了但是不会立即执行。需要调用start()
方法来启动线程。
Python的全局解释器锁(GIL)
在Python的多线程编程中,由于Python解释器中有全局解释器锁(GIL)的存在,导致多线程并不能提升CPU的使用率。GIL会让同一时刻只有一个线程执行Python字节码,而其他线程则处于等待状态。因此,Python的多线程编程被认为是伪并发。
示例一:多线程爬取网页
import requests
import threading
def download(url):
response = requests.get(url)
if response.status_code == 200:
print("{}下载成功".format(url))
else:
print("{}下载失败".format(url))
if __name__ == '__main__':
urls = [
'https://www.baidu.com/',
'https://www.zhihu.com/',
'https://www.github.com/'
]
threads = []
for url in urls:
t = threading.Thread(target=download, args=(url,))
threads.append(t)
t.start()
以上代码使用了多线程方式,对三个网页进行了下载。该示例展示了如何创建多个线程,对于每个线程执行一段相同的逻辑代码。
示例二:线程间通信
import threading
import time
class Producer(threading.Thread):
def __init__(self, name, queue):
threading.Thread.__init__(self, name=name)
self.queue = queue
def run(self):
for i in range(5):
print("{}: 已生产产品 {}".format(self.name, i))
self.queue.put(i)
time.sleep(1)
class Consumer(threading.Thread):
def __init__(self, name, queue):
threading.Thread.__init__(self, name=name)
self.queue = queue
def run(self):
while True:
product = self.queue.get()
if product is None:
break
print("{}: 已消费产品 {}".format(self.name, product))
if __name__ == '__main__':
queue = queue.Queue()
producer = Producer("producer", queue)
consumer1 = Consumer("consumer1", queue)
consumer2 = Consumer("consumer2", queue)
producer.start()
consumer1.start()
consumer2.start()
producer.join()
queue.put(None)
queue.put(None)
consumer1.join()
consumer2.join()
以上代码使用了队列queue
进行了线程间通信。其中,Producer
类创建了5个产品,并把它们塞入队列中;Consumer
类从队列中取出产品,进行消费。该示例展示了在多线程编程中,如何实现线程间的数据共享和通信。
结语
本文介绍了Python的线程和多线程编程。在多线程编程中需要注意GIL的存在,导致多线程并不能提升CPU的使用率。合理的使用多线程可提升程序的运行效率,但一定要注意线程安全并避免线程间的数据竞争和死锁等问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python并发编程之线程实例解析 - Python技术站