Google App Engine每5秒运行一次特定功能的最佳方法是什么(这需要插入数据库)?
答案 0 :(得分:1)
您可以使用cron https://cloud.google.com/appengine/docs/standard/python/config/cronref
我认为最快的计划是每5分钟执行一次,但是5分钟的任务可能会将一堆任务添加到交错的任务队列中,每5秒启动一次。
cron.yaml
cron:
- description: "task name"
url: /do-thing
schedule: every 5 minutes
请求处理程序
from google.appengine.ext.deferred import deferred
def do_thing():
pass
# request handler for "/do-thing"
class CronRequestHandler(webapp2.RequestHandler):
def get(self):
for seconds in xrange(0,300,5): # 0, 5, 10, ... 295]
deferred.defer(do_thing, _countdown=seconds)
您还可以有一个专用的手动缩放实例,它执行以下操作:
import time
# request handler for '/_ah/start'
class Start(webapp2.RequestHandler):
def get(self):
while True:
time.sleep(5)
do_thing()
答案 1 :(得分:1)
您可以通过cron结合一点点代码来做到这一点。
cron的最小间隔为1分钟。您要做的是每1分钟调用一次cron作业,并在cron作业中睡眠5秒钟,然后调用12次函数12次。
cron.xml
<cronentries>
<cron>
<url>/path/to/your/job</url>
<description>your job</description>
<schedule>every 1 minutes</schedule>
</cron>
</cronentries>
yourcronjob.java
public class YourCronJob extends HttpServlet {
@Override
public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
for (int i=0; i<12; i++) {
yourFunction();
Thread.sleep(5000);
}
}
}
答案 2 :(得分:1)
为避免在请求处理程序中休眠(通常这不是GAE的好用),您可以使用延迟5秒的自入队列请求队列:
或者,您可以使用1分钟的cron作业来排队12个单独的推送任务:
与上面的方法相比,这将产生更精确的定时,因为排队之间的延迟不会复杂化。
不确定Java运行时是否通过指定绝对执行时间而不是仅指定增量延迟来创建延迟的任务,如果这样的话,这可能是更好的方法,同时具有更精确的时间安排:这12个中的每个绝对执行时间可以根据当前cron作业的时间精确地计算任务,并且精确到分钟,这也可以最大程度地减少cron执行时间偏斜的影响。
答案 3 :(得分:0)
Google应用程序引擎提供了一个称为Cron的调度程序功能,可以在指定的时间间隔内运行重复的任务。这些任务通常称为cron作业。这些cron作业由App Engine Cron服务自动触发。例如,您可以使用cron作业每天发送一次电子邮件报告,或者每10分钟更新一些缓存的数据,或者每小时刷新一次摘要信息。
在您的情况下,您可以创建一个REST操作,以将新记录插入数据库。并且可以通过URL访问此REST操作。然后,您可以创建一个cron服务,该服务将在指定的时间段内运行,并通过REST URL调用其余的插入操作。
有关更多信息,请参阅https://cloud.google.com/appengine/docs/standard/java/config/cron。