Pythony,其中计划的作业有时保持活动状态,并且不';放羊

Pythony,其中计划的作业有时保持活动状态,并且不';放羊,python,pythonanywhere,Python,Pythonanywhere,这段代码是python 3.5,托管在Pythonywhere(linux)上 我使用带有open的来管理非阻塞群集,但有时计划的进程会遇到异常,导致作业终止;没关系,但令我困惑的是,锁有时不会被释放,所有后续尝试都无法继续,因为它们被锁定了 在这些情况下,我还看到一个进程活动了好几个小时(“预定任务”选项卡中的“获取进程”),可能这就是保持集群的进程。这些工作通常需要几分钟的时间。手动杀死它可以解决问题。我不明白这是怎么发生的。某些应该触发超时异常的东西有时似乎挂起(代码使用API并发调用其中

这段代码是python 3.5,托管在Pythonywhere(linux)上

我使用带有open的
来管理非阻塞群集,但有时计划的进程会遇到异常,导致作业终止;没关系,但令我困惑的是,锁有时不会被释放,所有后续尝试都无法继续,因为它们被锁定了

在这些情况下,我还看到一个进程活动了好几个小时(“预定任务”选项卡中的“获取进程”),可能这就是保持集群的进程。这些工作通常需要几分钟的时间。手动杀死它可以解决问题。我不明白这是怎么发生的。某些应该触发超时异常的东西有时似乎挂起(代码使用API并发调用其中的一些)

它是间歇性的。。。一个月一两次。 我可以要求pythonany在何处更积极地终止长时间运行的作业吗?主管是一个解决方案吗

这是代码的顶部:

 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 

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

我将调用代码包装为这样,以使用子进程,如

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)