python多线程的4种实现方式
下面是一个简单的Python多线程示例,其中使用了Lock锁来确保线程安全:
import threading
# 创建一个Lock锁
lock = threading.Lock()
# 定义一个共享变量
count = 0
# 定义一个线程函数
def worker():
global count
# 获取锁
lock.acquire()
try:
# 对共享变量进行操作
count += 1
print("Thread %s: count = %d" % (threading.current_thread().name, count))
finally:
# 释放锁
lock.release()
# 创建多个线程
threads = []
for i in range(5):
t = threading.Thread(target=worker)
threads.append(t)
# 启动所有线程
for t in threads:
t.start()
# 等待所有线程执行完毕
for t in threads:
t.join()
print("Final count:", count)
在上面的示例中,我们创建了一个Lock锁,并在worker函数中使用了它来确保对共享变量count的操作是线程安全的。每个线程在执行操作之前都会获取锁,执行完操作后再释放锁。这样可以确保每个线程都能够安全地对共享变量进行操作,避免了多个线程同时修改共享变量导致的数据不一致问题。
可以使用Python中的threading
模块和Semaphore
类来实现多线程中的信号量同步。
Semaphore是一种计数器,用于控制对共享资源的访问。当信号量的值大于0时,线程可以访问共享资源并将信号量的值减1;当信号量的值为0时,线程必须等待,直到其他线程释放资源并将信号量的值增加1。
下面是一个使用Semaphore实现多线程同步的示例代码:
import threading
# 创建一个信号量,初始值为1
semaphore = threading.Semaphore(1)
def worker():
# 获取信号量
semaphore.acquire()
try:
# 访问共享资源
print("Thread {} is accessing the shared resource".format(threading.current_thread().name))
finally:
# 释放信号量
semaphore.release()
# 创建多个线程并启动
for i in range(5):
t = threading.Thread(target=worker, name="Thread-{}".format(i))
t.start()
在上面的代码中,我们创建了一个初始值为1的信号量,并在多个线程中使用acquire()
方法获取信号量,访问共享资源,然后使用release()
方法释放信号量。由于信号量的初始值为1,因此只有一个线程可以访问共享资源,其他线程必须等待。
需要注意的是,在使用Semaphore时,必须确保在获取信号量后,一定要在try...finally
语句块中释放信号量,以确保即使在访问共享资源时发生异常,也能够正确地释放信号量。