我使用cherrypy在python中构建了一个restful服务,默认情况下是多线程的。因此,两个不同的http会话不会互相阻塞。
对于我的API的给定端点,我需要一种方法来启动长(非阻塞)后台任务,我可以随时停止。实际上我正在使用一个新线程来运行任务,该任务允许用户将其他请求发送到服务器而无需等待长任务完成。不幸的是,我还需要一种方法来随时停止后台任务,似乎我无法从主线程中停止新线程(我是否正确?)。
@cp.expose
@cp.tools.json_in()
@cp.tools.json_out()
class LongTaskEndpoint(object):
def GET(self):
thread = Thread(target=longRunningTask, args=())
thread.start()
return {"message" : "Long task started"}
我已尝试multiprocessing进程而非线程,但这似乎阻止了主线程(客户端无法从服务器获得任何响应,直到后台任务完成):
@cp.expose
@cp.tools.json_in()
@cp.tools.json_out()
class LongTaskEndpoint(object):
def GET(self):
process = multiprocessing.Process(target=longRunningTask, args=())
process.start()
return {"message" : "Long task started"}
如何启动一个长时间后台任务,该任务不会阻塞主线程(对于每个http会话)以及服务器可以随时停止的任务?