2013-03-04 104 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()