python cherrypy:如何启动长背景(可停止)任务

时间:2016-10-17 21:39:48

标签: python multithreading concurrency multiprocessing cherrypy

我使用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会话)以及服务器可以随时停止的任务?

0 个答案:

没有答案