2017-03-17 35 views
2

此代碼是託管在pythonanywhere(Linux)的蟒蛇3.5。Pythonanywhere計劃作業有時活着不釋放羊羣

我使用with open管理無阻塞的羊羣,但有時計劃過程運行到這會導致作業終止的異常;這是確定的,但我的困惑,鎖有時沒有釋放,以及所有後續嘗試均失敗來進行,因爲他們被鎖定。

在這種情況下我也看到了活着好幾個小時的過程(「提取工藝」在計劃任務選項卡)想必這是保持雞羣的過程。這些工作通常需要幾分鐘的時間。手動殺死它可以解決問題。我不明白這是怎麼回事。應該觸發超時異常的東西有時似乎掛起(代碼使用API​​調用其中一些併發)。

它是間歇性的...每月一次或兩次。 我可以要求pythonanywhere是在殺死長期任務更積極?主管是一個解決方案嗎?

這是代碼的頂部:

with open('neto_update_lock.lock', 'w+') as lock_file: 
     try: 
      fcntl.flock(lock_file, fcntl.LOCK_EX|fcntl.LOCK_NB) 
     except BlockingIOError: 
      print ("Can't get a lock. Sorry, stopping now") 
      raise 

回答

1

我包調用代碼像這樣,要使用的子過程,按照https://stackoverflow.com/a/26664130/401226

from multiprocessing import Process 

def run_with_limited_time(func, args, kwargs, time): 
    """Runs a function with time limit 
    """ 
    p = Process(target=func, args=args, kwargs=kwargs) 
    p.start() 
    p.join(time) 
    if p.is_alive(): 
     p.terminate() 
     print ("Terminated due to time out") 
     return False 

    return True 

if __name__ == "__main__": 
    # set up argparse 
    parser = argparse.ArgumentParser(description='Sync Dear & Neto for Bellbird') 
    parser.add_argument('command', choices=['stock','PO_and_product'], 
         help='Command: stock, PO_and_product') 

    args = parser.parse_args() 

    if args.command == 'stock': 
     run_with_limited_time(dear_to_neto_qoh_update,args=[],kwargs = {'test_run':False},time=25*60) 
    elif args.command == 'PO_and_product': 
     run_with_limited_time(func=update_neto_product_master,args=[], kwargs={'test_run':False,'verbose':False}, 
           time=25*60) 
1

我注意到,有些情況下外部請求掛起永遠情況。我建議您嘗試查明它是否是特定的請求/請求類型,並查看是否可以在一段時間後添加一些代碼以放棄它們。