PyMySql вызывает зависание при запуске из большого пакетного скрипта - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть сценарий оболочки, который запускает серию процессов 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...