2

我在一个循环中多次调用外部进程。给你一个伪代码:

for i in xrange(1, 100):
    call external proc which inserts a row into a table

这里的问题是,每当调用外部进程时,它都会在单独的线程中运行,这可能需要任何时间来运行。因此,python 将继续执行。这会导致插入遇到行锁并阻止插入。

在以下限制条件下,等待该过程完成的理想方式是什么:

  1. 我无法修改外部流程的工作方式。
  2. 我知道我可以,但我不想使用 hack,比如 thread.sleep
  3. 我无法修改任何数据库设置。

调用外部proc的代码是:

def run_query(query, username, password):
    try:
        process = subprocess.Popen( "<path to exe> -u " + username + " -p "+ password +" " + query, 
                                     shell = True,
                                     stdout = subprocess.PIPE,
                                     stderr = subprocess.PIPE )
        result, error = process.communicate()
        if error != '':
             _pretty_error('stderr', error)
    except OSError, error:
        _pretty_error('OSError', str(error))
    return result
4

3 回答 3

1

根据subprocess文档,您有几个选项:

  • process.wait()运行后调用process = subprocess.Popen(...)
  • 使用subprocess.call代替Popen
  • 使用subprocess.check_call代替Popen
于 2013-03-04T09:15:26.197 回答
0

您可以尝试启动该过程,例如:

process = subprocess.call( ["<path to exe>", "-u", "username", "-p",  password, query], 
                                 shell = False)

这样主进程会一直休眠,直到子进程结束,但你不会得到输出。

于 2013-03-04T09:14:22.483 回答
0

根据结果​​的外观,一种方法是使用 wait():

process = subprocess.Popen( "<path to exe> -u " + username + " -p "+ password +" " + query, 
                             shell = True,
                             stdout = subprocess.PIPE,
                             stderr = subprocess.PIPE )
retcode = process.wait()
于 2013-03-04T09:16:04.403 回答