Pythonanywhere 计划的作业有时会保持活动状态并且不会释放 flock
Pythonanywhere scheduled jobs sometimes stay alive and don't release flock
此代码是 python 3.5 托管在 pythonanywhere (linux) 上。
我正在使用 with open
来管理一个非阻塞的 flock,但有时计划的进程会遇到导致作业终止的异常;没关系,但令我困惑的是,锁有时没有释放,所有后续尝试都无法继续,因为它们被锁定了。
在这些情况下,我还看到一个进程存活了好几个小时('fetch processes' 在计划任务选项卡中)大概这是保持群的进程。这些作业通常需要几分钟。手动杀死它可以解决问题。我不明白这是怎么回事。有时应该触发超时异常的东西似乎挂起(代码使用 API 并发调用其中一些。)
断断续续的……一个月一两次。
我可以在任何地方请求 python 更积极地终止长 运行 的工作吗?主管会是一个解决方案吗?
这是代码的顶部:
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
我注意到有些情况下外部请求永远挂起。我建议您尝试找出它是否是特定的 requests/types 请求,看看您是否可以添加一些代码以在一段时间后放弃它们。
我按照
这样包装了调用代码,以使用子流程
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)
此代码是 python 3.5 托管在 pythonanywhere (linux) 上。
我正在使用 with open
来管理一个非阻塞的 flock,但有时计划的进程会遇到导致作业终止的异常;没关系,但令我困惑的是,锁有时没有释放,所有后续尝试都无法继续,因为它们被锁定了。
在这些情况下,我还看到一个进程存活了好几个小时('fetch processes' 在计划任务选项卡中)大概这是保持群的进程。这些作业通常需要几分钟。手动杀死它可以解决问题。我不明白这是怎么回事。有时应该触发超时异常的东西似乎挂起(代码使用 API 并发调用其中一些。)
断断续续的……一个月一两次。 我可以在任何地方请求 python 更积极地终止长 运行 的工作吗?主管会是一个解决方案吗?
这是代码的顶部:
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
我注意到有些情况下外部请求永远挂起。我建议您尝试找出它是否是特定的 requests/types 请求,看看您是否可以添加一些代码以在一段时间后放弃它们。
我按照
这样包装了调用代码,以使用子流程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)