1

我想使用 Python 的多处理在不使用锁的情况下进行并发处理(对我而言,锁与多处理相反),因为我想在 Web 请求期间同时从不同资源构建多个报告(通常需要大约 3 秒但使用多处理,我可以在 0.5 秒内完成)。

我的问题是,如果我向网络公开这样的功能并让 10 个用户同时提取同一份报告,我突然同时打开了 60 个解释器(这会导致系统崩溃)。这只是使用多处理的常识结果,还是有一个技巧可以解决这个潜在的噩梦?

谢谢

4

3 回答 3

2

如果您尝试使用multiprocess将并发性添加到网络应用程序,那么您正在寻找错误的树。如果您为每个请求创建流程,那么您将完全错误的树。multiprocess不是您想要的(至少作为并发模型)。

您很有可能想要一个像Twisted这样的异步网络框架。

于 2010-04-29T16:29:27.333 回答
2

如果您真的担心实例过多,您可以考虑使用 Semaphore 对象保护调用。如果我了解您在做什么,那么您可以使用线程信号量对象:

from threading import Semaphore
sem = Semaphore(10)
with sem:
    make_multiprocessing_call()

我假设它make_multiprocessing_call()会自行清理。

这样,只有 10 个“额外”的 python 实例将被打开,如果另一个请求出现,它只需要等到前一个请求完成。不幸的是,这不会按“队列”顺序......或特别是任何顺序。

希望有帮助

于 2010-04-29T17:33:58.280 回答
1

只有当您有多个代理写入一个源时,锁才是必需的。如果他们只是访问,则不需要锁(正如您所说,这违背了多处理的目的)。

你确定这会导致系统崩溃?在使用 CGI 的 Web 服务器上,每个请求都会产生一个新进程,因此看到数千个同时进程并不罕见(在 python 中授予应该使用 wsgi 并避免这种情况),这不会导致系统崩溃。

我建议你测试一下你的理论——制造 10 个同时访问应该不难——看看你的服务器是否真的崩溃了。

于 2010-04-29T16:28:53.137 回答