是否致电Popen
“封锁”?
不,只是创建一个subprocess.Popen
立即返回,为您提供一个可以等待或以其他方式使用的对象。如果你想阻止,很简单:
subprocess.check_call(shlex.split(cmd1))
同时,我不确定为什么你要把你的参数放在一个字符串中,然后尝试shlex
他们回到一个列表。为什么不直接写清单呢?
cmd1 = ["echo", fn]
subprocess.check_call(cmd1)
虽然这有效,但它似乎并没有运行多个进程;看起来它只是串行运行
是什么让你这么想?鉴于每个进程只是尽快将两个进程启动到后台,因此很难判断它们是否并行运行。
如果您想验证是否从多个处理中获得工作,您可能需要添加一些打印或日志记录(并抛出类似的内容os.getpid()
到消息中)。
同时,看起来您正试图完全复制以下效果multiprocessing.Pool.map_async
脱离循环multiprocessing.Pool.apply_async
,除了不是累积结果,而是将每个结果存储在名为的变量中RESULT
然后在使用之前将其扔掉。为什么不直接使用map_async
?
最后,你问是否multiprocessing
是适合这项工作的工具。好吧,你显然需要一些异步的东西:check_call(args(file1))
必须阻止other_python_function_to_do_something_to_file(file1)
,但同时不阻塞check_call(args(file2))
.
我可能会用threading
,但实际上,这并没有多大区别。即使您所在的平台上进程启动成本很高,您也已经付出了这笔成本,因为重点是运行 N * M 组子进程,因此另外 8 个子进程池不会造成任何损害。而且,通过在线程之间共享数据而意外创建竞争,或者意外地创建看起来像是在进程之间共享数据但实际上没有共享数据的代码的风险很小,因为没有任何内容可以共享。所以,无论你更喜欢哪一个,就去吧。
另一种选择是编写一个事件循环。我实际上可能会开始自己解决这个问题,但我会后悔的,而且你不应该这样做......