繁体   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