python线程间通信的几种方法
Python作为一种高级编程语言,支持多线程并发编程。但是,多线程并发编程也存在一些问题,例如线程间的通信。本文将介绍Python中线程间通信的几种方法。
1.共享变量(Shared Variable)
共享变量是最常见、最简单的线程间通信方式。多个线程可以共同访问同一变量,从而实现数据共享。
示例代码:
```
import threading
# 共享变量
num = 0
# 线程1:对共享变量num加1
def add_num():
global num
for i in range(1000000):
num += 1
进程间通信和线程间通信的区别 # 线程2:对共享变量num减1
def sub_num():
global num
for i in range(1000000):
num -= 1
if __name__ == '__main__':
# 创建两个线程
t1 = threading.Thread(target=add_num)
t2 = threading.Thread(target=sub_num)
# 启动两个线程
t1.start()
t2.start()
# 等待两个线程执行完成
t1.join()
t2.join()
# 打印最终结果
print('num:', num)
```
输出结果:
```
num: -18181
```
可以看到,由于两个线程同时对共享变量num进行修改,导致最终结果不是我们预期的0。这就是共享变量的问题所在:多个线程同时对同一个变量进行修改,会导致数据不一致的问题。为了解决这个问题,我们可以使用锁(Lock)来保证同一时间只有一个线程对变量进行修改。
2.锁(Lock)
锁是用来控制多个线程对共享资源进行访问的工具。在Python中,锁的实现方式有很多,例如Thread模块中的Lock、RLock、Semaphore等,也可以使用Threading模块中的Lock、
RLock、Semaphore等。
示例代码:
```
import threading
# 共享变量
num = 0
# 创建锁
lock = threading.Lock()
# 线程1:对共享变量num加1
def add_num():
global num
# 获取锁
lock.acquire()
for i in range(1000000):
num += 1
# 释放锁
lease()
# 线程2:对共享变量num减1
def sub_num():
global num
# 获取锁
lock.acquire()
for i in range(1000000):
num -= 1
# 释放锁
lease()
if __name__ == '__main__':
# 创建两个线程
t1 = threading.Thread(target=add_num)
t2 = threading.Thread(target=sub_num)
# 启动两个线程
t1.start()
t2.start()
# 等待两个线程执行完成
t1.join()
t2.join()
# 打印最终结果
print('num:', num)
```
输出结果:
```
num: 0
```
可以看到,使用锁可以保证同一时间只有一个线程对变量进行修改,从而保证数据的一致性。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论