为什么多处理锁定失败?

Why is multiprocessing locking failing?

我刚刚从官方文档中试验 some example 并注意到锁定似乎不像宣传的那样有效。发生了什么事?

from multiprocessing import Process, Lock

def f(l, i):
    l.acquire()
    for j in range(10000):
        print j,
    print
    l.release()

if __name__ == '__main__':
    lock = Lock()

    for num in range(10):
        Process(target=f, args=(lock, num)).start()

运行在Ipython笔记本中,输出如下:

2716 2717 27180 1 2 3 4 5 6 7 8 9 10

很简单。您真的认为可以从 Web 应用程序中生成进程吗?因为这就是 IPython Notebook 实际上是什么。
不,你不能。如果 webapps 能够随意生成进程,那将是一个巨大的安全漏洞。他们无法在客户端执行此操作,因为这一切都发生在浏览器的沙箱中。他们不应该在服务器端这样做,因为您可能想以这种方式产生 1000000 个进程,那又怎样?服务器应该自杀?
显然 multiprocessing 模块在 IPython Notebook 中被模拟,所有事情实际上都发生在一个进程中——这个进程拥有锁,所以一切都很好。 普通 Python 和 IPython 解释器的输出是可以的,如果你不尝试通过 webapp 控制进程的有趣想法,它会尊重锁。