2013-03-04 106 views
2

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

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

这里的问题是,每当外部进程被调用时,它运行在一个单独的线程,这可能需要很长时间才能运行任何金额。所以,python会继续执行。这会导致插入运行到行锁并阻止插入。

什么是等待的过程中完成的,在下列约束的理想方法:

  1. 我不能修改外部过程的工作方式。
  2. 我知道我可以,但我不想用黑客,像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 
+0

你能告诉我们“调用外部过程的插入到表'的Python代码吗? – NPE 2013-03-04 09:03:05

+0

添加到我原来的问题 – Vegetto 2013-03-04 09:10:36

回答

1

您根据subprocess文件有多种选择结果t看起来,一种方法是使用wait():

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

似乎涵盖所有选项,但没有为我工作,可能是我的一个更深层次的问题。 – Vegetto 2013-03-04 09:43:16

+0

@Vegetto它怎么不工作?他们是否仍然按错误顺序执行? – 2013-03-04 09:46:29

0

你可以尝试启动类似的过程:

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

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

  • 运行process = subprocess.Popen(...)
  • 使用subprocess.call,而不是Popen
  • 使用subprocess.check_call代替Popen
+0

行似乎仍然被锁定,但我再也看不到错误了。这也可能是一些DB方面的错误。 – Vegetto 2013-03-04 09:40:45

0

取决于如何后调用process.wait()