我有一个Shell脚本,它将启动一系列python3进程。我使用'&'字符使多个并行运行的python脚本像这样:
myscript.sh
python3 script1.py param1 param2 param3 &
python3 script1.py param4 param5 param6 &
python3 script1.py param7 param8 param9 &
wait
python3 script1.py param10 param11 param12 &
python3 script1.py param13 param14 param15 &
python3 script1.py param16 param17 param18 &
wait
... etc
在script1.py中,我使用PyMySql与Google Cloud SQL进行MySQL事务。包含PyMySql代码后,shell脚本有时会永远挂起。删除SQL代码后,它永远不会挂起。但是,我为每个PyMySql事务添加了超时和try / catch处理,但从未见过超时。我什至在SQL项之后登录到文件,并看到在SQL代码之前,执行仍在继续,但是python script1.py进程仍然存在,并且从未进入shell脚本中的下一个语句。
为了使这个问题更加令人困惑,当我直接从shell执行此命令时,它永远不会挂起。但是,当我使用发布/订阅订阅收听消息并在后台启动脚本时,该消息始终挂在脚本中的某个位置。它所挂的特定行会有所不同。
PyMySql似乎正在发生某些事情,并且正在运行来自Pub / Sub订阅的并行进程。有什么理由我不能做我想在这里做的事吗?
script1.py
import mySqlTools
# Collect data
# Store to Google Datastore
for d in data:
mySqlTools.writeSql(curID, ts, data0, data1)
这是SQL代码。它在一个单独的文件中,该文件在script1.py的末尾导入并执行。
mySqlTools.py
TIMEOUT = 15
def writeSql(id, ts, data0, data1) :
# Connect to the database
try:
connection = pymysql.connect(host='xxx.xxx.xxx.xxx',
user='root',
password='password', # Password
read_timeout=TIMEOUT,
write_timeout=TIMEOUT,
connect_timeout=TIMEOUT,
db='my_database',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
except Exception as e :
print('Error: Exception in pymysql.connection' + str(e) + '\n')
return
try:
# Create a new record
with connection.cursor() as cursor:
sql = "INSERT INTO `" + id + "` (`ts`, `data0`, `data1`) VALUES (%s, %s, %s)"
cursor.execute(sql, (str(ts), data0, data1))
connection.commit()
except Exception as e :
print('\tException: Unable to store record: ' + str(e) + '\n')
finally:
connection.close()