从大型批处理shell脚本运行时,PyMySql导致挂起

时间:2018-09-11 09:11:12

标签: python-3.x shell google-compute-engine pymysql

我有一个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()

0 个答案:

没有答案