2

我有一个 C 程序,它需要两个参数并输出一个数字。

./a.out 2 3(例如)。

它做了一些计算成本很高的操作,所以我想知道是否可以使用 Python 的多处理库来运行一堆 C 程序,然后将所有数字编译成列表或表格或一些数据结构?

谢谢。

这不是重复的,因为我的问题是我怎样才能并行(例如许多线程)!

我不知道如何让 1 个 Python 程序运行数百个 C 程序并将所有输出捕获到 Python 列表中。使用过程似乎是 1 对 1。

4

4 回答 4

2

您可以使用 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)])
于 2012-10-13T15:15:50.990 回答
1

您可以subprocess.Popen在不使用线程的情况下一次运行多个进程。

如果它们的输出足够短以适合操作系统缓冲区,则相当容易:

要异步启动程序,请使用

subprocess.Popen(['command', args],stdout=subprocess.PIPE)

只需对所有命令执行此操作并将结果放入数组中。

然后:

 for process in subprocesses:
   process.wait()
   stdout,stderr = process.communicate()

如果子进程输出大量数据,这将不起作用,因为 wait() 会死锁:进程想要写入更多,但缓冲区已满,您正在等待进程完成后再读取。

在这种情况下,您将需要查看select.poll()或类似的 API:s

于 2012-10-13T15:23:46.100 回答
0

您可能想研究使用 Pythonsctypes模块,它可以让您将 C 程序编译到库中,然后从您的 python 脚本中调用该库。

此外,swig项目将让您从 Python 调用 C 或 C++ 代码而不会太麻烦(请参阅此答案)。

如果你走这条路,你可能应该考虑使用线程池或其他某种机制来并行调用。

于 2012-10-13T18:18:09.557 回答
0

您可以尝试使用 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 是正确的,这里不需要线程,因为子进程会创建新进程。如果你的程序有一个巨大的输出(大于管道长度限制),他也可能会出现死锁,所以我们必须从管道中读取并等待进程完成。

于 2012-10-13T15:13:05.847 回答