Python循环同步
我在一个循环里多次调用一个外部程序。简单来说就是这样:
for i in xrange(1, 100):
call external proc which inserts a row into a table
问题是,每次调用这个外部程序时,它会在一个单独的线程中运行,而这个程序的运行时间可能不确定。所以,Python会继续执行后面的代码。这就导致了插入操作可能会遇到行锁,从而无法插入数据。
在以下条件下,理想的等待这个程序完成的方法是什么:
- 我不能修改外部程序的运行方式。
- 我知道可以,但我不想用一些小技巧,比如thread.sleep。
- 我不能修改任何数据库的设置。
调用外部程序的代码是:
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