序言
本文介绍了线程同步的概念以及如何在 Python 中实现线程同步,以确保多个线程按照预期顺序访问共享资源。

线程同步运作混乱难题
线程同步通常用于同时启用多个函数或公式,这能提高 CPU 利用率,降低解决多个任务总时长的计算机执行时间。然而,线程同步也有一些缺点,例如,在存在静态变量的情况下,如果多个函数同时访问该变量,可能会导致计算误差。为了解决这个问题,需要使用 join 方法或设置静态变量。
我们可以通过以下代码片段来模拟线程同步中的运行混乱问题:
import threading, time
l1 = []
lock = threading.RLock()
def function1(x, y):
for i in range(x):
l1.append(i)
if i == 0:
time.sleep(1)
end_time = time.time()
print(f"t{y} is finished in {end_time - time1}s")
def function11(x, y):
for i in range(x):
l1.append(i)
end_time = time.time()
print(f"t{y} is finished in {end_time - time1}s")
if __name__ == '__main__':
t1 = threading.Thread(target=function1, args=(100, 1))
t2 = threading.Thread(target=function11, args=(100, 2))
t3 = threading.Thread(target=function11, args=(100, 3))
time1 = time.time()
print(f"time starts in {time1}")
t1.start()
t2.start()
t3.start()
print(l1)
运行以上代码后,全局变量 l1 中的元素不是按照 0、1、2、3 的顺序填充的,而是被多个函数无序调用,因此需要使用 join 方法来保证线程有序访问共享资源。
“join方法”解决多线程运行无序问题
我们可以通过修改代码,在 t1 线程中加入 join 方法来解决多线程运行无序问题:
import threading, time
l1 = []
lock = threading.RLock()
def function1(x, y):
for i in range(x):
l1.append(i)
if i == 0:
time.sleep(1)
end_time = time.time()
print(f"t{y} is finished in {end_time - time1}s")
def function11(x, y):
for i in range(x):
l1.append(i)
end_time = time.time()
print(f"t{y} is finished in {end_time - time1}s")
def function2(x, y):
for i in range(x):
l1.append(i)
if i == 0:
time.sleep(1)
end_time = time.time()
print(f"t{y} is finished in {end_time - time1}s")
if __name__ == '__main__':
t1 = threading.Thread(target=function2, args=(100, 1))
t2 = threading.Thread(target=function11, args=(100, 2))
t3 = threading.Thread(target=function11, args=(100, 3))
time1 = time.time()
print(f"time starts in {time1}")
t1.start()
t1.join()
t2.start()
t3.start()
print(l1)
运行以上代码后,全局变量 l1 中的元素被按照顺序填充。
threading.Thread()的常见参数
- group:默认值为 None,使用 ThreadGroup 类来存储。
- target:可启动对象,例如函数或方法。
- name:默认值为 “Thread-N”,表示线程的名称。
- args:默认值为空数组,主要参数 target 中传递给可启动对象的主要参数数组。
- kwargs:默认值为空字典 {},主要参数 target 中传递给可启动对象的关键字参数词典。
- daemon:默认值为 None。
以上是 threading.Thread() 常见的主要参数。
总结
本文中,我们学习了如何在 Python 中实现线程同步,以确保多个线程按照预期顺序访问共享资源。我们介绍了 Python 中的线程同步问题,并演示了如何使用 join 方法来保证线程有序访问共享资源。此外,我们还了解了 threading.Thread() 的常见参数。
原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6915.html
