对循环中Python子进程感到困惑
我正在尝试用Python自动处理一些大数据文件。
处理的过程是串联的,也就是说,脚本1写一个文件,然后脚本2处理这个文件,接着脚本3处理脚本2的输出,依此类推。
我在一个多线程的环境中使用了subprocess模块。
我有一个类,它创建了一些脚本的元组,比如("scr1.sh","scr2.sh","scr3.sh")。
然后还有另一个类,它使用类似下面的调用:
for script in scriplist:
subprocess.call(script)
我想问的是,在这个for循环中,是否每个脚本只有在subprocess.call(script1)返回成功的状态码后才会被调用?
还是说因为我使用了subprocess.call,所以三个脚本会一个接一个地被调用,而不需要使用"sleep"或"wait"?我想确保第二个脚本只有在第一个脚本完成后才开始运行。
补充说明:pydoc上说
"subprocess.call(*popenargs, **kwargs) 运行命令及其参数。等待命令完成,然后返回返回码属性。"所以在上面的for循环中,它是否会在迭代下一个脚本之前等待每个返回码?
我对多线程还很陌生。这里附上了运行分析的类的简化代码。subprocess.call循环是这个类的一部分。
class ThreadedDataProcessor(Thread):
def __init__(self, in_queue, out_queue):
# Uses Queue
Thread.__init__(self)
self.in_queue = in_queue
self.out_queue = out_queue
def run(self):
while True:
path = self.in_queue.get()
if path is None:
break
myprocessor = ProcessorScriptCreator(path)
scrfiles = myprocessor.create_and_return_shell_scripts()
for index,file in enumerate(scrfiles):
subprocess.call([file])
print "CALLED%s%s" % (index,file) *5
#report(myfile.describe())
#report("Done %s" % path)
self.out_queue.put(path)
in_queue = Queue()
1 个回答
2
这个循环会一个接一个地调用每个脚本,等前一个脚本完成后再调用下一个,不管前一个脚本是成功还是失败。你可能想这样做:
try:
map(subprocess.check_call, script_list)
except Exception, e:
# failed script
每次调用run
时,都会启动一个新的线程,并且这个线程会在run
完成后结束。在一个线程里,你会用子进程来逐个执行脚本。
你需要确保每个线程里的调用不会影响到其他线程里的调用。比如说,如果多个线程同时尝试从脚本中读取和写入同一个文件,这样就会出现问题。