1. 本际云推荐 - 专业推荐VPS、服务器,IDC点评首页
  2. 云主机运维
  3. VPS运维

线程同步python的完成及线程同步有序化

序言

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

线程同步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()的常见参数

  1. group:默认值为 None,使用 ThreadGroup 类来存储。
  2. target:可启动对象,例如函数或方法。
  3. name:默认值为 “Thread-N”,表示线程的名称。
  4. args:默认值为空数组,主要参数 target 中传递给可启动对象的主要参数数组。
  5. kwargs:默认值为空字典 {},主要参数 target 中传递给可启动对象的关键字参数词典。
  6. daemon:默认值为 None。

以上是 threading.Thread() 常见的主要参数。

总结

本文中,我们学习了如何在 Python 中实现线程同步,以确保多个线程按照预期顺序访问共享资源。我们介绍了 Python 中的线程同步问题,并演示了如何使用 join 方法来保证线程有序访问共享资源。此外,我们还了解了 threading.Thread() 的常见参数。

原创文章,作者:小编小本本,如若转载,请注明出处:https://www.benjiyun.com/yunzhujiyunwei/vps-yunwei/6915.html