Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 此任务队列设置有什么问题?_Python_Google App Engine - Fatal编程技术网

Python 此任务队列设置有什么问题?

Python 此任务队列设置有什么问题?,python,google-app-engine,Python,Google App Engine,我已经在我为客户托管的站点上设置了此任务队列实现,它有一个cron作业,每天凌晨2点运行“/admin/tasks/queue”,它将要发送的电子邮件排队,“/admin/tasks/email”,并使用游标,以便进行小批量排队。由于某种原因,昨晚/admin/tasks/queue一直被这个代码运行,所以发送了我的全部电子邮件配额:/。我对这个代码做了什么错误吗 class QueueUpEmail(webapp.RequestHandler): def post(self):

我已经在我为客户托管的站点上设置了此任务队列实现,它有一个
cron作业
,每天凌晨2点运行“
/admin/tasks/queue
”,它将要发送的电子邮件排队,“
/admin/tasks/email
”,并使用
游标
,以便进行小批量排队。由于某种原因,昨晚
/admin/tasks/queue
一直被这个代码运行,所以发送了我的全部电子邮件配额
:/
。我对这个代码做了什么错误吗

class QueueUpEmail(webapp.RequestHandler):
    def post(self):
        subscribers = Subscriber.all()
        subscribers.filter("verified =", True)

        last_cursor = memcache.get('daily_email_cursor')
        if last_cursor:
            subscribers.with_cursor(last_cursor)

        subs = subscribers.fetch(10)
        logging.debug("POST - subs count = %i" % len(subs))
        if len(subs) < 10:
            logging.debug("POST - Less than 10 subscribers in subs")
            # Subscribers left is less than 10, don't reschedule the task
            for sub in subs:
                task = taskqueue.Task(url='/admin/tasks/email', params={'email': sub.emailaddress, 'day': sub.day_no})
                task.add("email")
            memcache.delete('daily_email_cursor')
        else:
            logging.debug("POST - Greater than 10 subscibers left in subs - reschedule")
            # Subscribers is 10 or greater, reschedule
            for sub in subs:
                task = taskqueue.Task(url='/admin/tasks/email', params={'email': sub.emailaddress, 'day': sub.day_no})
                task.add("email")
            cursor = subscribers.cursor()
            memcache.set('daily_email_cursor', cursor)
            task = taskqueue.Task(url="/admin/tasks/queue", params={})
            task.add("queueup")
class QueueUpEmail(webapp.RequestHandler):
def post(自我):
subscribers=Subscriber.all()
subscribers.filter(“verified=,True)
last\u cursor=memcache.get('daily\u email\u cursor')
如果最后一个光标:
订阅服务器。带\u光标(最后一个\u光标)
subs=subscribers.fetch(10)
debug(“POST-subs count=%i”%len(subs))
如果len(subs)<10:
调试(“POST-SUB中少于10个订户”)
#剩余订户少于10个,请不要重新安排任务
对于sub中的sub:
task=taskqueue.task(url='/admin/tasks/email',params={'email':sub.emailaddress,'day':sub.day_no})
任务。添加(“电子邮件”)
memcache.delete('daily\u email\u cursor')
其他:
调试(“POST-子系统中剩余的子系统数量超过10个-重新调度”)
#订阅服务器为10或更大,请重新安排
对于sub中的sub:
task=taskqueue.task(url='/admin/tasks/email',params={'email':sub.emailaddress,'day':sub.day_no})
任务。添加(“电子邮件”)
cursor=subscribers.cursor()
memcache.set('daily\u email\u cursor',cursor)
task=taskqueue.task(url=“/admin/tasks/queue”,params={})
任务。添加(“排队”)

我可以看到一些潜在的问题。首先,您将光标存储在memcache中,而memcache不能保证保存任何内容。如果在处理过程中出现缓存丢失,您将再次发送每条消息


其次,如果任务因任何原因失败,它们将被重新尝试;因为这个原因,它们应该被设计成幂等的。当然,在发送电子邮件的情况下,这几乎是不可能的,因为一旦发送了一条消息,如果您的任务在发送后由于其他原因死亡,它就无法回滚。至少,我建议在发送消息后,尝试更新每个订户实体上的“上次电子邮件发送日期”字段。当然,这本身并不是万无一失的,因为电子邮件发送可能会成功,实体更新可能会失败。这也会增加整个过程的开销,因为您将为每个订户进行写操作。

感谢您的分析,我最初的想法是memcache可能是一个问题。memcache可能是您遇到问题的直接原因,是的。最好的方法是将光标作为参数从每个任务传递到下一个任务。