我正在使用Azure托管Flask编写Python Web应用程序。我需要做一些后台工作。当我在本地测试应用程序时,一切正常。但是,一旦我将更新推送到 Azure,它就会停止运行。现在,我设置了一个multithreading.Process
,根据日志文件,Azure 不会启动另一个进程。以下是我的代码的相关部分:
#task queue and comm pipes
tasks = Queue()
parent_pipe, child_pipe = Pipe()
def handle_queue_execution(tasks, pipe):
logging.info("starting task queue handler")
while True:
if pipe.recv():
logging.debug("preparing to get task from queue")
task = tasks.get()
args = tasks.get()
logging.debug("executing task %s(%s)", get_fn_name(task), clean_args(args))
task(args)
logging.debug("task %s(%s) executed successfully", get_fn_name(task), clean_args(args))
queue_handler = Process(target=handle_queue_execution, args=(tasks, child_pipe,))
queue_handler.daemon = True
if __name__ == '__main__':
queue_handler.start()
我对此有几个半相关的问题:
1) 为什么 Azure 不会启动另一个进程?
您会注意到,handle_queue_execution函数以记录器调用开始。该消息在 Azure 上托管时不会显示在日志文件中,排队的任务也不会执行。同样,在本地主机上运行时,此工作的两个方面都符合预期。
2)有更好的方法吗?
我对Python和Azure都相当陌生,所以如果有更好的方法来执行这种类型的任务处理,我愿意听到它。我已经考虑过使用类似 Celery 的东西,但我不知道如何设置它,我更愿意在学习这些新技能时自己实现。
非常感谢。
Python 有多种其他方法来启动新进程。线程很可能是这里最简单的。
#task queue and comm pipes
import threading
tasks = Queue()
parent_pipe, child_pipe = Pipe()
def handle_queue_execution(tasks, pipe):
logging.info("starting task queue handler")
while True:
if pipe.recv():
logging.debug("preparing to get task from queue")
task = tasks.get()
args = tasks.get()
logging.debug("executing task %s(%s)", get_fn_name(task), clean_args(args))
task(args)
logging.debug("task %s(%s) executed successfully", get_fn_name(task), clean_args(args))
T1 = threading.Thread(target=handle_que_execution, args=(tasks, child_pipe,))
if __name__ == '__main__':
T1.start()