并发是指两个或多个事件在同时发生,而多线程是一种实现并发的方式。在Python中,可以使用threading
模块来实现多线程。
线程的理论基础是进程,进程是操作系统进行资源分配和调度的基本单位。每个进程都有自己的内存空间,包括代码段、数据段和堆栈段。每个进程都可以拥有多个线程,每个线程都可以独立地执行指令序列。
线程之间共享同一个进程的资源,包括内存空间。这意味着多个线程可以同时访问和修改相同的变量。然而,这也可能导致线程之间的冲突,如数据竞争和死锁。
为了避免线程之间的冲突,可以使用同步互斥机制。其中,最常用的是锁机制。锁是一种同步原语,可以确保在任何时刻只有一个线程可以访问共享资源。
下面是一个简单的示例,说明了如何使用线程和锁来实现并发和同步互斥:
import threading
# 共享资源
counter = 0
# 锁
lock = threading.Lock()
# 线程函数
def increment():
global counter
for _ in range(1000000):
# 上锁
lock.acquire()
counter += 1
# 释放锁
lock.release()
# 创建线程
thread1 = threading.Thread(target=increment)
thread2 = threading.Thread(target=increment)
# 启动线程
thread1.start()
thread2.start()
# 等待线程结束
thread1.join()
thread2.join()
# 输出结果
print(counter)
在上面的示例中,定义了一个全局变量counter
作为共享资源,并创建了一个锁lock
。increment
函数是线程的执行代码,它使用lock.acquire()
来获取锁,确保在修改counter
变量时只有一个线程在执行。然后,使用lock.release()
释放锁,允许其他线程获取锁并执行相同的操作。
通过创建和启动两个线程,可以实现并发地递增counter
变量的值。最后,输出结果应该是2000000
,表示两个线程共同递增了counter
变量一百万次。
这个示例展示了如何利用线程和锁来实现并发和同步互斥。然而,需要注意的是,使用多线程并发操作共享资源时,需要尽量避免数据竞争和死锁等问题,以保证程序的正确性和性能。