谷歌应用引擎cron django在30秒后失败

时间:2017-09-04 07:24:18

标签: django google-app-engine cron

我正在尝试使用将在后台连续运行的cron在app引擎上安排任务。我已经在本地服务器上编写了cron任务,但是当我通过谷歌云控制台运行它时,它在30秒后失败了。

cron.yaml:

cron:
- description: daily tweets streaming
  url: /path/to/cron
  schedule: every 24 hours

views.py:

def testing(request):
    print("okasha---")
    from streamTweets import start_stream
    start_stream()

urls.py:

  url(r'^path/to/cron$', views.testing, name="testing"),

我已经阅读了一个解决方案,说将任务划分为子任务,但我无法将其划分为子任务。我的日志说没有找到任何条目但是当我直接通过url访问它时它会启动脚本,但是在30秒后它会出现502错误的网关错误。

1 个答案:

答案 0 :(得分:1)

您的应用是否使用金枪鱼?

gunicorn默认情况下将使用同步工作程序,并在30秒后将其杀死。 在我的Google App Engine应用程序上,它在30秒后杀死了所有内容,无论是云任务还是cron作业。

解决它的两种可能方法是:

使用异步工作程序,请参见此处:{{3}},我还没有尝试过。

或更改已同步工作程序的超时,这是我的app.yaml'--timeout = 600'设置Gunicorn工作程序超时。 这是针对Google App Engine Python 3标准应用程序的。

<!DOCTYPE html>
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
   const vid = document.querySelector('video');
navigator.mediaDevices.getUserMedia({video: true}) // request cam
.then(stream => {
  vid.srcObject = stream; // don't use createObjectURL(MediaStream)
  return vid.play(); // returns a Promise
})
.then(()=>{ // enable the button
  const btn = document.querySelector('button');
  btn.disabled = false;
  btn.onclick = e => {
    takeASnap()
    .then(download);
  };
});

function takeASnap(){
  const canvas = document.createElement('canvas'); // create a canvas
  const ctx = canvas.getContext('2d'); // get its context
  canvas.width = vid.videoWidth; // set its size to the one of the video
  canvas.height = vid.videoHeight;
  ctx.drawImage(vid, 0,0); // the video
  return new Promise((res, rej)=>{
    canvas.toBlob(res, 'image/jpeg'); // request a Blob from the canvas
  });
}
function download(blob){
  // uses the <a download> to download a Blob
  let a = document.createElement('a'); 
  a.href = URL.createObjectURL(blob);
  a.download = 'screenshot.jpg';
  document.body.appendChild(a);
  a.click();
}
});
</script>
</head>
<body>
<button disabled>
  take a snapshot</button>
<video></video>

</body>
</html>