【问题标题】:Pythonanywhere scheduled jobs sometimes stay alive and don't release flockPythonanywhere 计划的作业有时会保持活力并且不会释放羊群
【发布时间】:2017-03-17 23:36:38
【问题描述】:

此代码是托管在 pythonanywhere (linux) 上的 python 3.5。

我正在使用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 

【问题讨论】:

    标签: python pythonanywhere


    【解决方案1】:

    我注意到在某些情况下外部请求会永远挂起。我建议您尝试找出它是否是特定的请求/请求类型,看看您是否可以添加一些代码以在一段时间后放弃它们。

    【讨论】:

      【解决方案2】:

      我按照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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-06-14
        • 2019-07-22
        • 2016-03-06
        • 1970-01-01
        • 2012-09-20
        • 2023-03-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多