终止GAE Python后台线程

时间:2013-12-02 14:49:59

标签: google-app-engine python-2.7

关闭Google App Engine后台主题的正确方法是什么?我已经尝试将循环变量设置为false并尝试连接()线程,但无论我尝试什么,我都会多次调用_ / ah / stop最后以“进程终止,因为后端花了很长时间才能关闭”。

它有效,但感觉不是很稳定,是否有更好的方法可以关闭它们?

一些代码:

_thread = None`
_should_run = True

def work():
    service = BqClient.getService()
    tabledata = service.tabledata()

    while (_should_run and not runtime.is_shutting_down()):
        try: 
            queue = taskqueue.Queue('stream-queue')
            tasks = queue.lease_tasks(300, 1000)
            ...do stuff and then sleep...

def startStreamThread():
    _thread = BackgroundThread(target = work)
    _thread.start()

def stopStreamThread():
    _should_run = False
    if (_thread and _thread.isAlive()):
        _thread.join(20)

1 个答案:

答案 0 :(得分:0)

在您的代码中,您的线程负责自己的关闭。这是一件好事,因为BackgroundThread可以比生成他的请求更长。

  

如果可能,App Engine会通知后端 30秒   终止它。

如果循环中的一批工作时间超过30秒,则线程将无法正常结束。也许您可以尝试减少每个循环中完成的工作量,并在runtime.is_shutting_down之前测试time.sleep

while True:
    # Do stuff that need less than 30 sec.
    do_stuff()
    # Check for shutdown or sleep.
    if runtime.is_shutting_down():
        break
    else:
        time.sleep(1)

有时如果可能(想想硬件故障)是不可能的,你的后端会在很短的时间内关闭。

你永远不能避免突然关机。确保它不会破坏您的应用程序逻辑。