为什么多处理锁定失败?
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 控制进程的有趣想法,它会尊重锁。
我刚刚从官方文档中试验 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 控制进程的有趣想法,它会尊重锁。