python中的并发:多进程和多线程

多进程

官方文档

多线程

python中的多线程主要通过thread模块实现

该模块提供了操作多个线程(也被称为 轻量级进程 或 任务)的底层原语 —— 多个控制线程共享全局数据空间。为了处理同步问题,也提供了简单的锁机制(也称为 互斥锁 或 二进制信号)。threading 模块基于该模块提供了更易用的高级多线程 API。

多线程示例

在Python中创建和运行多线程:

import threading

# 定义要执行的线程任务函数
def task():
    print("Thread is running")

# 创建线程对象
thread = threading.Thread(target=task)

# 启动线程
thread.start()

# 等待线程结束
thread.join()

print("Thread execution completed")

在这个示例中,我们首先定义了一个名为task的线程任务函数,该函数在执行时会打印一条消息。然后,我们使用threading.Thread类创建了一个线程对象,并将task函数作为目标传递给线程对象。接着,通过调用线程对象的start方法启动线程。最后,使用join方法等待线程执行完毕。
在实际应用中,你可以创建多个线程对象,并同时执行它们的任务。同时,要注意线程间的数据共享和同步机制,以确保线程安全。
需要注意的是,Python中的多线程是基于线程切换的,并不适用于特别耗时的CPU密集型任务,因为Python中的全局解释器锁(GIL)限制了多线程的并行执行。如果需要处理CPU密集型任务或者提高并发性能,可以考虑使用multiprocessing模块来实现多进程并行。

锁机制

在Python中,要实现多线程的互斥和同步,可以使用threading.Lock对象来创建互斥锁。互斥锁可以确保在任何给定的时间内只有一个线程能够访问临界资源,从而避免竞争条件和数据不一致的问题。下面是一个示例展示如何使用互斥锁实现多线程的互斥和同步:


import threading
# 创建互斥锁对象

lock = threading.Lock()
counter = 0

def increment():
    global counter
    for _ in range(100000):
        # 获取互斥锁
        lock.acquire()
        counter += 1
        # 释放互斥锁
        lock.release()


# 创建多个线程并执行任务
threads = []
for _ in range(5):
    t = threading.Thread(target=increment)
    threads.append(t)
    t.start()

# 等待所有线程执行完毕
for t in threads:
    t.join()

# 打印计数器的值
print("Counter:", counter)

在这个示例中,我们创建了一个互斥锁对象lock,并定义了一个全局计数器counter。然后,我们编写了一个increment函数作为线程的任务,该函数在循环中每次对计数器递增。在每次递增之前,线程会获取互斥锁,以确保只有一个线程能够访问并修改计数器的值,然后再释放互斥锁。

创建了多个线程对象后,我们启动这些线程,并使用join方法等待它们执行完毕。最后,我们打印计数器的值来检查互斥和同步是否正常工作。

通过使用互斥锁,我们确保了线程对共享资源的互斥访问,防止了数据竞争和不一致性。这样可以确保多线程的安全执行,并提供了同步机制。

猜你喜欢

转载自blog.csdn.net/m0_51312071/article/details/132381326