Python多线程编程实例:使用函数实现线程与锁
Python是一门高级编程语言,支持多线程编程。多线程是指同时运行多个线程,每个线程都独立执行,但是线程之间可能会发生互斥、同步等问题,需要使用一些技术手段进行解决。在Python中,可以使用Thread类和Lock类实现多线程编程。
本文将通过一个实例,演示如何使用函数实现线程与锁。我们将创建一个生产者与消费者模型,模拟生产和消费商品的过程。其中,生产者和消费者将在不同的线程中运行,使用锁控制商品的数量和状态。
实现思路:
1. 定义一个全局变量num,表示商品数量,初始值为0。
2. 定义一个Lock对象,用于控制num变量的访问。
3. 定义一个生产者函数produce()和一个消费者函数consume(),分别用于生产和消费商品,函数中使用锁控制num变量的修改。
4. 创建两个Thread对象,分别表示生产者和消费者,将函数作为参数传递给Thread对象。
5. 启动Thread对象,让生产者和消费者开始运行。
6. 等待生产者和消费者线程结束。
代码实现:
import threading
import time
# 定义变量和锁
num = 0
lock = threading.Lock()
# 生产者函数
def produce():
global num
while True:
lock.acquire() # 获取锁
if num < 10:
num += 1
print("Produced 1, num =", num)
else:
print("Stock full!")
lock.release() # 释放锁
time.sleep(1)
# 消费者函数
def consume():
global num
while True:
lock.acquire() # 获取锁
if num > 0:
num -= 1
print("Consumed 1, num =", num)
else:
print("Stock empty!")
lock.release() # 释放锁
time.sleep(1)
# 创建生产者和消费者线程
t1 = threading.Thread(target=produce)
t2 = threading.Thread(target=consume)
# 启动线程
t1.start()
t2.start()
# 等待线程结束
t1.join()
t2.join()
代码说明:
- 在全局变量部分,定义了num变量和lock锁对象。
- 在生产者函数中,使用while True语句实现循环。通过获取锁和释放锁来控制num变量的访问。如果商品数量小于10,生产者就可以生产出一件商品,并将num加1;否则,生产者将无法生产商品。
- 在消费者函数中,也使用while True语句实现循环。通过获取锁和释放锁来控制num变量的访问。如果商品数量大于0,消费者就可以消费一件商品,并将num减1;否则,消费者将无法消费商品。
- 在创建生产者和消费者线程时,使用Thread对象的target参数分别指定生产者函数和消费者函数。
- 在启动线程后,使用join()方法等待线程结束。
注意:本例中使用的是线程锁,不是进程锁。如果需要使用进程锁,请使用multiprocessing.Lock()函数。
