2015-03-02 53 views
0

我无法在等待终止的情况下同时启动多个进程。在无需等待的情况下启动python中的多个进程

我正在遍历目录,然后在外部脚本中处理文件的内容。

命令行执行看起来像以下:

python process.py < /dir/file 

这里是Python代码

for root, directory, file in os.walk(dir): 
    for name in file: 
     input_file = open(os.path.join(root, name)) 
     input_text = input_file.read().encode('utf-8') 
     input_file.close() 

     command = "python process.py" 
     process = subprocess.Popen(command.split(), shell=False, stdin=subprocess.PIPE) 
     process.stdin.write(input_text) 
     log.debug("Process started with pid {0}".format(process.pid)) 
     process.communicate() 

一些样本是否有任何的方式开始他们无需等待终止?

回答

2

是的。将它们存储在列表中,并且不要在循环中使用process.communicate()。它阻止。

从文档:

与互动的过程:将数据发送至标准输入。从stdout和stderr中读取数据,直到达到文件结尾。 等待进程终止。可选的输入参数应该是要发送到子进程的字符串,如果没有数据应该发送给子进程,则为None。

所以结果应该是这样的:

# list to store processes after creating them 
prcoesses = list() 

for root, directory, file in os.walk(dir): 
    for name in file: 
     input_file = open(os.path.join(root, name)) 
     input_text = input_file.read().encode('utf-8') 
     input_file.close() 

     command = "python process.py" 
     process = subprocess.Popen(command.split(), 
            shell=False, 
            stdin=subprocess.PIPE) 
     processes.append(process) 

     process.stdin.write(input_text) 
     log.debug("Process started with pid {0}".format(process.pid)) 
     # process.communicate() 

# wait for processes to complete 
for process in processes: 
    stdoutdata, stderrdata = process.communicate() 
    # ... do something with data returned from process 

为了有可能要使用process pool这是可以通过multiprocessing模块处理数量有限。

+0

如果我把所有processessess放在列表上,但是你有什么办法控制正在运行的进程的数量,我的意思是如果我有50个文件需要处理,但是我一次只需要10个文件? – user2847238 2015-03-03 08:29:50

+1

google“python multiprocessing” – 2015-03-03 08:39:03

+0

谢谢,经过一番争斗,我找到了解决方案,如何从Pool运行进程。仍然没有管理如何在Pool上进行懒惰迭代。 – user2847238 2015-03-03 13:20:24

相关问题