Python 代码没有按顺序执行? MySQLdb UPDATE 以意外顺序提交

Python code not executing in order? MySQLdb UPDATE commits in unexpected order

我有一个我正在处理的 Python 2.7 脚本,它从 MySQL table 中检索行,循环遍历数据来处理它,然后应该按此顺序执行以下操作:

  1. 更新我们之前获得的 table 行以设置锁定值 在每一行中为 TRUE

  2. UPDATE 查询执行并通过 MySQLdb 提交后,进程的线程池应该 运行 来自原始循环。

实际发生的是更新查询似乎在线程池完成后以某种方式提交。我尝试将其重构为 try/finally 语句以确保确定,但现在它要么仍然在之后执行,要么只是不提交 UPDATE 并且 运行s ThreadPool 无论如何。

这确实让人头疼。我认为我只是在做一些非常错误和明显的事情,但在看了这么长时间之后没有抓住它。非常感谢任何输入!

要点如下:

from multiprocessing.pool import ThreadPool, IMapIterator

import MySQLdb as mdb
import os, sys, time
import re

from boto.s3.connection import S3Connection
from boto.s3.bucket import Bucket


...

con = mdb.connect('localhost', 'user', 'pass', 'db')


with con: 

    cur = con.cursor()
    cur.execute("SELECT preview_queue.filename, preview_queue.product_id, preview_queue.track, products.name, preview_queue.id FROM preview_queue join `catalog_module-products` AS products on products.id = preview_queue.product_id where locked != 1")

    rows = cur.fetchall()
    mp3s_to_download = []
    lock_ids = []
    last_directory = ""

    if len(rows) > 0:
        for row in rows:
            base_dir = str(get_base_dir(row[1], row[3]))
            mp3s_to_download.append([base_dir, str(row[0])])

            if last_directory != "preview_temp/"+base_dir:
                if not os.path.exists("preview_temp/"+base_dir):
                    try:
                        os.makedirs("preview_temp/"+base_dir)

                    except OSError, e:
                        pass

            last_directory = "preview_temp/"+base_dir   
            lock_ids.append(str(row[4]))

        if len(lock_ids) > 0:
            action_ids = ','.join(lock_ids)

            try:
                cur.execute("UPDATE preview_queue SET locked = 1 WHERE id IN ({})".format(action_ids))
                con.commit()
            finally:
                pool = ThreadPool(processes=20)
                pool.map(download_file, mp3s_to_download)


                cur.close()

A finally 子句保证执行,即使 try 子句引发异常。这里可能发生的情况是引发异常,阻止提交更新,但无论如何都会触发线程。

这并不是 try/finally 的恰当用法。相反,使用普通的 try/except 来捕获和记录任何异常,然后可能使用 else 子句仅在没有引发异常时才启动线程。