我有一个 C 程序,它需要两个参数并输出一个数字。
./a.out 2 3(例如)。
它做了一些计算成本很高的操作,所以我想知道是否可以使用 Python 的多处理库来运行一堆 C 程序,然后将所有数字编译成列表或表格或一些数据结构?
谢谢。
这不是重复的,因为我的问题是我怎样才能并行(例如许多线程)!
我不知道如何让 1 个 Python 程序运行数百个 C 程序并将所有输出捕获到 Python 列表中。使用过程似乎是 1 对 1。
我有一个 C 程序,它需要两个参数并输出一个数字。
./a.out 2 3(例如)。
它做了一些计算成本很高的操作,所以我想知道是否可以使用 Python 的多处理库来运行一堆 C 程序,然后将所有数字编译成列表或表格或一些数据结构?
谢谢。
这不是重复的,因为我的问题是我怎样才能并行(例如许多线程)!
我不知道如何让 1 个 Python 程序运行数百个 C 程序并将所有输出捕获到 Python 列表中。使用过程似乎是 1 对 1。
您可以使用 aThreadPool
并行运行许多任务。
from multiprocessing.pool import ThreadPool
import subprocess
def f(x):
a, b = x
res = subprocess.check_output(["./a.out", str(a), str(b)])
return int(res.strip())
p = ThreadPool()
results = p.map(f, [(2,3), (5,6), (9,10)])
您可以subprocess.Popen
在不使用线程的情况下一次运行多个进程。
如果它们的输出足够短以适合操作系统缓冲区,则相当容易:
要异步启动程序,请使用
subprocess.Popen(['command', args],stdout=subprocess.PIPE)
只需对所有命令执行此操作并将结果放入数组中。
然后:
for process in subprocesses:
process.wait()
stdout,stderr = process.communicate()
如果子进程输出大量数据,这将不起作用,因为 wait() 会死锁:进程想要写入更多,但缓冲区已满,您正在等待进程完成后再读取。
在这种情况下,您将需要查看select.poll()
或类似的 API:s
您可以尝试使用 python 的 subprocess 模块,它允许您启动进程,等待它结束并捕获它的所有输出(stdout,stderr)。
在这里您可以查看子流程文档:http ://docs.python.org/library/subprocess.html
你可以看看我的例子:
#file t1.py
import time
def __main__():
time.sleep(10)
print(10)
if __name__ == "__main__":
__main__()
#file: t2.py
import time
import subprocess
def __main__():
N = 10
V = 0
pp = [subprocess.Popen("t1.py", stdout = subprocess.PIPE, shell = True) for _ in range(0, N)]
oo = ["" for _ in range(0, N)]
ff = [False for _ in range(0, N)]
while True:
for i in range(0, N):
oo[i] += pp[i].stdout.read()
if pp[i].poll() != None:
ff[i] = True
done = all(ff)
if done:
for o in oo:
V += int(o)
break
print(V)
if __name__ == "__main__":
__main__()
文件 t2.py 完全符合您的要求。文件 t1.py 模拟您长时间运行的 C 程序。
我编辑了我的示例,因为 perh 是正确的,这里不需要线程,因为子进程会创建新进程。如果你的程序有一个巨大的输出(大于管道长度限制),他也可能会出现死锁,所以我们必须从管道中读取并等待进程完成。