У меня есть сценарий оболочки, который запускает серию процессов 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 я делаю MySQLтранзакции в Google Cloud SQL с использованием PyMySql.С включенным кодом PyMySql сценарий оболочки иногда зависает навсегда.Когда код SQL удален, он никогда не зависает.Однако я добавил тайм-ауты и обработку try / catch для каждой транзакции PyMySql, и я никогда не видел его тайм-аут.Я даже захожу в файл после элементов SQL и вижу, что выполнение продолжается в любом коде SQL, но процесс python script1.py остается и никогда не переходит к следующим операторам в сценарии оболочки.
Чтобы сделать это болеесбивает с толку, когда я выполняю это непосредственно из оболочки, он никогда не зависает.Однако, когда я использую свою подписку Pub / Sub для прослушивания сообщения и запускаю сценарий в фоновом режиме, он всегда висит где-то в сценарии.Конкретные строки, на которых он висит, различаются.
Кажется, что-то происходит с 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()