2

当我将任务添加到任务队列时,有时任务会丢失。我没有收到任何错误,但我只是在日志中找不到任务。假设我添加了 n 个任务。如果这 n 个任务没有完成,计算就无法进行。但是,我发现这些 n 个任务中的一个或多个在添加后就丢失了,而我的整个算法在中间停止了。可能是什么原因 ?我保留一个变量 w 来检查添加任务的次数。我观察到 w = n 虽然没有创建一些任务。

def addtask_whx(index,user,seqlen,vp_compress,iseq_compress):
global w
while True :
    timeout_ms = 100    
    taskq_name = 'whx'+'--'+str(index[0])+'-'+str(index[1])+'-'+str(index[2])+'-'+str(index[3])+'-'+str(index[5]) + '--' + user

    try :

        taskqueue.add(name=taskq_name+str(timeout_ms),queue_name='whx',url='/whx', params={'m': index[0],'n': index[1],'o': index[2],'p': index[3],'q':0,'r':index[5],'user': user,'seqlen':seqlen,'vp':vp_compress,'iseq':iseq_compress})
        w = w+1
        break
    except DeadlineExceededError:
        taskq_name = taskq_name + str(timeout_ms)
        time.sleep(float(timeout_ms)/1000)
        timeout_ms = timeout_ms*4
        logging.error("WHX Task Queue Add Timeout Retrying")
    except TransientError:
        taskq_name = taskq_name + str(timeout_ms)
        time.sleep(float(timeout_ms)/1000)
        timeout_ms = timeout_ms*4
        logging.error("WHX Task Queue Add Transient Error Retrying")
    except TombstonedTaskError:
        logging.error("WHX Task Queue Tombstoned Error")
        break   
4

1 回答 1

1

免责声明:这不是您要寻找的答案,但我希望它对您有所帮助。

没有完成这 n 个任务,计算就无法进行

听起来您正在使用任务队列来完成它不适合做的事情。您应该阅读:http ://code.google.com/appengine/docs/java/taskqueue/overview.html#Queue_Concepts

任务不保证按到达的顺序执行,也不保证只执行一次。在某些情况下,单个任务可能会执行多次或根本不执行。此外,App Engine 可以根据可用资源自行决定取消和重新排队任务。例如,你timeout_ms = 100的很低;如果必须启动一个新的 JVM,这可能需要几秒钟,任务 n+1 和 n+2 可能会在任务 n 之前执行。

简而言之,任务队列不是执行严格顺序计算的可靠机制。你已经被警告过了。

-tjw

于 2011-04-07T18:30:54.170 回答