由于GIL的线程化Python代码?

如果您依赖的是具有Global Interpreter Lock(即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 )之间中断,导致更新丢失。 结果是共享状态的随机值。

为了使更新保持一致,运行方法需要锁定read-modify-write部分(循环内部)的共享状态,或者有一些方法来检测共享状态自读取以来何时发生更改。


没有 - GIL只是保护python内部的多线程,改变他们的状态。 这是一个非常低级别的锁定,足以使python自己的结构保持一致的状态。 它不包含您需要在自己的代码中涵盖线程安全性的应用程序级别锁定。

锁定的本质是确保特定的代码块仅由一个线程执行。 GIL对单个字节码大小的块进行强制执行,但通常希望锁定跨越比这更大的代码块。


加入讨论:

因为GIL存在,所以一些操作在Python中是原子的,并且不需要锁定。

http://www.python.org/doc/faq/library/#what-kinds-of-global-value-mutation-are-thread-safe

但正如其他答案所述,只要应用程序逻辑需要它们(例如在生产者/消费者问题中),您仍然需要使用锁。

链接地址: http://www.djcxy.com/p/15163.html

上一篇: threaded Python code because of the GIL?

下一篇: MongoDB/CouchDB for storing files + replication?