2015-06-14 99 views
0

我有一個Python 2.7腳本,我正在從MySQL表中檢索行,通過數據循環來處理它,然後按照以下順序執行以下操作:Python代碼沒有按順序執行? MySQLdb UPDATE以意外的順序提交

  1. 更新,我們剛剛前面的錶行中每一行設置加鎖值 爲TRUE

  2. 後更新查詢執行,並通過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() 

回答

1

一個finally條款是保證執行,即使try條款引發了異常。這裏可能發生的事情是,引發異常,阻止提交更新,但線程無論如何都會觸發。

這實際上並不是try/finally的恰當用法。相反,使用正常的嘗試/除了捕獲和記錄任何異常,然後可能使用else子句僅在未引發異常時才啓動線程。

+0

就是這樣,只需要使用別人而不是最後。我認爲它可能會執行終於:無論是否有例外,但其他:似乎更可靠地做到這一點。謝謝您的幫助! –