- 线程间通信
线程间通信强调的是贤臣之间传递对象引用
共享变量
-
线程安全
1)线程有GIL锁,但是拿到GIL锁不代表可以一直执行下去 2)现代计算机多线程也是A执行一会,B执行一会这样交替执行。 不然太僵硬了
代码:
```python
import requests
import time
from threading import Thread
zero = 0
def foo():
global zero
for i in range(10**7):
zero +=1
zero -=1
if __name__ == '__main__':
process_array = []
for i in range(2):
p = Thread(target=foo)
process_array.append(p)
p.start()
for p in process_array:
p.join()
print(zero)
-
解决线程安全
1)将重要指令包装成原子操作(不可分割的)。 2)加互斥锁
import requests
import time
from threading import Thread,Lock
zero = 0
lock = Lock()
def foo():
global zero
for i in range(10**7):
with lock:
zero +=1
zero -=1
if __name__ == '__main__':
process_array = []
for i in range(2):
p = Thread(target=foo)
process_array.append(p)
p.start()
for p in process_array:
p.join()
print(zero)
本文探讨了Python中线程间通信的问题,强调了线程安全的重要性。通过示例展示了在无锁情况下全局变量`zero`在多线程环境中可能出现的不正确递增和递减。为了解决这个问题,文章介绍了使用原子操作和互斥锁(`Lock`)来确保线程安全。通过在关键指令周围使用`with lock:`语句,确保了在多线程环境下对`zero`的修改是线程安全的。
520

被折叠的 条评论
为什么被折叠?



