Python循环同步

2 投票
3 回答
744 浏览
提问于 2025-04-17 17:50

我在一个循环里多次调用一个外部程序。简单来说就是这样:

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

问题是,每次调用这个外部程序时,它会在一个单独的线程中运行,而这个程序的运行时间可能不确定。所以,Python会继续执行后面的代码。这就导致了插入操作可能会遇到行锁,从而无法插入数据。

在以下条件下,理想的等待这个程序完成的方法是什么:

  1. 我不能修改外部程序的运行方式。
  2. 我知道可以,但我不想用一些小技巧,比如thread.sleep。
  3. 我不能修改任何数据库的设置。

调用外部程序的代码是:

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

3 个回答

0

根据结果的样子,有一种方法可以使用wait()函数:

process = subprocess.Popen( "<path to exe> -u " + username + " -p "+ password +" " + query, 
                             shell = True,
                             stdout = subprocess.PIPE,
                             stderr = subprocess.PIPE )
retcode = process.wait()
0

你可以尝试这样启动这个过程:

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

这样的话,主程序会一直等到子程序结束,但你不会看到任何输出。

1

根据subprocess的文档,你有几种选择:

  • 在运行完process = subprocess.Popen(...)之后,调用process.wait()
  • 使用subprocess.call来代替Popen
  • 使用subprocess.check_call来代替Popen

撰写回答