0
我有一個Python 2.7腳本,我正在從MySQL表中檢索行,通過數據循環來處理它,然後按照以下順序執行以下操作:Python代碼沒有按順序執行? MySQLdb UPDATE以意外的順序提交
更新,我們剛剛前面的錶行中每一行設置加鎖值 爲TRUE
後更新查詢執行,並通過MySQLdb的承諾,進程線程池應在運行來自原始循環的數據。
實際發生的情況是UPDATE查詢似乎在ThreadPool完成後以某種方式提交。我試圖將它重構爲try/finally語句來確保,但是現在它仍然在執行,或者不提交UPDATE並運行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()
就是這樣,只需要使用別人而不是最後。我認爲它可能會執行終於:無論是否有例外,但其他:似乎更可靠地做到這一點。謝謝您的幫助! –