Python - 有关并发使用`multiprocess`的问题

时间:2010-04-29 16:20:45

标签: python multithreading multiprocessing gil

我想使用Python的多处理来进行并发处理而不使用锁(对我来说锁是多处理的反面)因为我想在Web请求期间的同一时间从不同的资源构建多个报告(通常需要3秒,但多处理我可以在.5秒内完成。

我的问题是,如果我将这样的功能暴露给网络并让10个用户同时拉同一个报告,我突然有60个解释器同时打开(会导致系统崩溃< /强>)。这只是使用多处理的常识结果,还是有诀窍来解决这个潜在的噩梦?

由于

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

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

我假设make_multiprocessing_call()将自行清理。

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

希望有所帮助

答案 2 :(得分:1)

如果你有多个代理到源,那么

锁只是永远不可靠的。如果他们只是访问,则不需要锁定(正如您所说的那样,无法实现多处理的目的)。

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

我建议你测试你的理论 - 制作10个同时访问并不困难 - 看看你的服务器是否确实崩溃了。