我想使用 Python 的多处理在不使用锁的情况下进行并发处理(对我而言,锁与多处理相反),因为我想在 Web 请求期间同时从不同资源构建多个报告(通常需要大约 3 秒但使用多处理,我可以在 0.5 秒内完成)。
我的问题是,如果我向网络公开这样的功能并让 10 个用户同时提取同一份报告,我突然同时打开了 60 个解释器(这会导致系统崩溃)。这只是使用多处理的常识结果,还是有一个技巧可以解决这个潜在的噩梦?
谢谢
我想使用 Python 的多处理在不使用锁的情况下进行并发处理(对我而言,锁与多处理相反),因为我想在 Web 请求期间同时从不同资源构建多个报告(通常需要大约 3 秒但使用多处理,我可以在 0.5 秒内完成)。
我的问题是,如果我向网络公开这样的功能并让 10 个用户同时提取同一份报告,我突然同时打开了 60 个解释器(这会导致系统崩溃)。这只是使用多处理的常识结果,还是有一个技巧可以解决这个潜在的噩梦?
谢谢
如果您尝试使用multiprocess
将并发性添加到网络应用程序,那么您正在寻找错误的树。如果您为每个请求创建流程,那么您将完全错误的树。multiprocess
不是您想要的(至少作为并发模型)。
您很有可能想要一个像Twisted这样的异步网络框架。
如果您真的担心实例过多,您可以考虑使用 Semaphore 对象保护调用。如果我了解您在做什么,那么您可以使用线程信号量对象:
from threading import Semaphore
sem = Semaphore(10)
with sem:
make_multiprocessing_call()
我假设它make_multiprocessing_call()
会自行清理。
这样,只有 10 个“额外”的 python 实例将被打开,如果另一个请求出现,它只需要等到前一个请求完成。不幸的是,这不会按“队列”顺序......或特别是任何顺序。
希望有帮助
只有当您有多个代理写入一个源时,锁才是必需的。如果他们只是访问,则不需要锁(正如您所说,这违背了多处理的目的)。
你确定这会导致系统崩溃?在使用 CGI 的 Web 服务器上,每个请求都会产生一个新进程,因此看到数千个同时进程并不罕见(在 python 中授予应该使用 wsgi 并避免这种情况),这不会导致系统崩溃。
我建议你测试一下你的理论——制造 10 个同时访问应该不难——看看你的服务器是否真的崩溃了。