gpt4 book ai didi

python - 使用多处理停止 web2py 中长时间运行的操作

转载 作者:太空宇宙 更新时间:2023-11-03 16:35:03 25 4
gpt4 key购买 nike

我有一个 web2py 应用程序,它基本上用作 Python 脚本的浏览器界面。该脚本通常返回得很快,但有时可能需要很长时间。我想为用户提供一种方法来停止脚本的执行(如果脚本执行时间太长)。

我目前正在这样调用该函数:

def myView():  # this function is called from ajax
session.model = myFunc() # myFunc is from a module which i have complete control over
return dict(model=session.model)

myFunc,当使用某些选项调用时,会使用多处理,但最终仍然需要很长时间。我需要某种方法来终止该函数,或者至少终止该线程的子线程。

我尝试的第一件事是在新进程中运行myFunc,并滚动我自己的简单事件系统来终止它:

# in the controller
def myView():
p_conn, c_conn = multiprocessing.Pipe()
events = multiprocessing.Manager().dict()
proc = multiprocessing.Process(target=_fit, args=(options, events c_conn))
proc.start()
sleep(0.01)
session.events = events
proc.join()
session.model = p_conn.recv()
return dict(model=session.model)

def _fit(options, events pipe):
pipe.send(fitting.logistic_fit(options=options, events=events))
pipe.close()

def stop():
try:
session.events['kill']()
except SystemExit:
pass # because it raises that error intentionally
return dict()

# in the module
def kill():
print multiprocessing.active_children()
for p in multiprocessing.active_children():
p.terminate()
raise SystemExit

def myFunc(options, events):
events['kill'] = kill

我遇到了一些主要问题。

  1. stop() 中的 session 并不总是与 myView() 中的 session 相同,因此 session.events 为 None .
  2. 即使 session 相同,kill() 也无法正确杀死子进程。
  3. 长时间运行的函数会挂起 web2py 线程,因此在函数完成之前甚至不会处理 stop()

我考虑过不调用 join() 并在稍后使用 AJAX 来获取函数的结果,但我无法将流程对象保存在 session 供以后使用。管道似乎能够被腌制,但后来我遇到了无法从另一个 View 访问同一 session 的问题。

如何实现此功能?

最佳答案

对于长时间运行的任务,您最好通过内置 scheduler 对它们进行排队。如果您希望允许用户手动停止耗时过长的任务,可以使用 scheduler.stop_task(ref) 方法(其中 ref 是任务iduuid)。或者,当您对任务进行排队时,您可以指定超时,这样如果在超时时间内未完成,任务就会自动停止。

您可以执行简单的 Ajax 轮询,以在任务完成时通知客户端(或使用 websockets 或 SSE 实现更复杂的功能)。

关于python - 使用多处理停止 web2py 中长时间运行的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37301559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com