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

1 投票
3 回答
793 浏览
提问于 2025-04-15 22:10

我想用Python的多进程功能来同时处理任务,而不想用锁(对我来说,锁就像是多进程的反面)。因为我希望在一次网页请求中,能同时从不同的资源生成多个报告(通常需要大约3秒,但用多进程可以缩短到0.5秒)。

我的问题是,如果我把这个功能放到网上,假设有10个用户同时请求同一个报告,那么我一下子就会打开60个解释器(这会导致系统崩溃)。这是使用多进程的常见结果吗,还是说有办法避免这个潜在的麻烦?

谢谢

3 个回答

1

锁只在有多个“写入”操作的情况下才需要。如果只是读取数据,就不需要锁(而且正如你所说,这样会失去多进程的意义)。

你确定这样会导致系统崩溃吗?在使用CGI的网页服务器上,每个请求都会产生一个新的进程,所以同时有成千上万个进程是很正常的(不过在Python中,应该使用wsgi来避免这种情况),这些进程并不会导致系统崩溃。

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

2

如果你试图用 multiprocess 来给网络应用增加并发,那你就走错方向了。如果你为每个请求都创建一个进程,那就更是完全错误了。multiprocess 不是你想要的(至少在并发模型上不是)。

你很可能需要一个异步网络框架,比如 Twisted

2

如果你真的担心会有太多的实例被创建,可以考虑用一个信号量(Semaphore)来保护这个调用。根据我对你所做事情的理解,你可以使用线程信号量对象:

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

我假设 make_multiprocessing_call() 会自己处理清理工作。

这样的话,最多只会同时打开10个“额外”的Python实例。如果有新的请求过来,它就得等前面的请求完成后才能继续。不过不幸的是,这些请求的完成顺序不会按照“队列”的顺序来,也就是说没有特定的顺序。

希望这对你有帮助。

撰写回答