python线程间通信

本文探讨了Python中线程间通信的问题,强调了线程安全的重要性。通过示例展示了在无锁情况下全局变量`zero`在多线程环境中可能出现的不正确递增和递减。为了解决这个问题,文章介绍了使用原子操作和互斥锁(`Lock`)来确保线程安全。通过在关键指令周围使用`with lock:`语句,确保了在多线程环境下对`zero`的修改是线程安全的。
摘要由CSDN通过智能技术生成
  • 线程间通信

线程间通信强调的是贤臣之间传递对象引用
共享变量

  • 线程安全

     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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值