簡體   English   中英

(Python)阻止子流程

[英](Python) Blocking sub-process

我有一個腳本類,可以從數據庫查詢並顯示結果。 問題是當我在腳本下面添加子進程時,腳本掛起(或等待,如果以ctr-c終止,它將繼續)

例如。 如果刪除了組B,則將運行組A。 如果刪除了A組,則B組將運行

#Group A
queryStrings = ['SELECT top 100 * FROM myDb', 
'SELECT top 10 * FROM anotherDb']

## class that connects to db and output the content ## 
db = Database
conn = db.connectToDb()

for query in queryStrings:
     db.runPreQueries(conn, query)

conn.close

##Group B 

if os.path.exists("DoSomething.vbs"):
    p = subprocess.Popen("cscript DoSomething.vbs", stdout=subprocess.PIPE, stdin=subprocess.PIPE, shell=True)
    stdout, stderr = p.communicate()

print("vbs completed")

我也嘗試使用subprocess.call,然后終止它。 這不會掛起,但不會執行腳本

p = subprocess.call("cscript DoSomething.vbs")
p.terminate()

當運行conn.close您並沒有真正關閉數據庫。 它什么都不做,因為您沒有調用該函數。

因此,下一個呼叫將保持阻塞狀態,等待數據庫訪問。

固定:

conn.close()

請注意,隨后運行流程的正確方法是(因為您不關心輸入,輸出...):

subprocess.check_call(["cscript","DoSomething.vbs"])

如果cscript返回一個非零的返回碼(足夠安全),這將失敗。

請注意,您的數據庫接口可能支持上下文管理器,在這種情況下,最好編寫以下代碼:

with db.connectToDb() as conn:    
    for query in queryStrings:
         db.runPreQueries(conn, query)

在這種情況下,退出with塊時將自動關閉連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM