gpt4 book ai didi

python - 由于 GIL,多线程 Python 代码中是否不需要锁?

转载 作者:IT老高 更新时间:2023-10-28 21:37:44 24 4
gpt4 key购买 nike

如果您依赖具有全局解释器锁(即 CPython)的 Python 实现并编写多线程代码,那么您真的需要锁吗?

如果 GIL 不允许并行执行多条指令,难道共享数据就不需要保护了吗?

对不起,如果这是一个愚蠢的问题,但这是我一直想知道的关于多处理器/核心机器上的 Python 的问题。

同样的事情也适用于任何其他具有 GIL 的语言实现。

最佳答案

如果你在线程之间共享状态,你仍然需要锁。 GIL 只在内部保护解释器。您仍然可以在自己的代码中出现不一致的更新。

例如:

#!/usr/bin/env python
import threading

shared_balance = 0

class Deposit(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
balance = shared_balance
balance += 100
shared_balance = balance

class Withdraw(threading.Thread):
def run(self):
for _ in xrange(1000000):
global shared_balance
balance = shared_balance
balance -= 100
shared_balance = balance

threads = [Deposit(), Withdraw()]

for thread in threads:
thread.start()

for thread in threads:
thread.join()

print shared_balance

在这里,您的代码在读取共享状态 (balance = shared_balance) 和写回更改的结果 (shared_balance = balance) 之间可能会中断,从而导致更新丢失.结果是共享状态的随机值。

为了使更新保持一致,run 方法需要锁定 read-modify-write 部分(在循环内)周围的共享状态或具有 some way to detect when the shared state had changed since it was read .

关于python - 由于 GIL,多线程 Python 代码中是否不需要锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/105095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com