我正在尝试使用将在后台连续运行的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错误的网关错误。
答案 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>