我正在使用Python GAE SDK.
我需要在6000多个实例上完成一些处理MyKind.在单个请求中执行速度太慢,因此我正在使用任务队列.如果我只对一个实体进行单个任务处理,那么它应该只需几秒钟.
该文件指出,只有100个任务可以在"批"来添加.(他们的意思是什么?在一个请求中?在一个任务中?)
因此,假设"批处理"意味着"请求",我试图找出为数据存储区中的每个实体创建任务的最佳方法.你怎么看?
如果我可以假设顺序MyKind永远不会改变,那就容易多了.(处理实际上永远不会改变MyKind实例 - 它只会创建其他类型的新实例.)我可以创建一堆任务,给每个任务一个偏移量,从哪里开始,间隔小于100.然后,每个任务可以创建执行实际处理的单个任务.
但是如果有这么多实体原始请求无法添加所有必要的调度任务呢?这让我觉得我需要一个递归解决方案 - 每个任务都会查看它给出的范围.如果范围中只有一个元素,则对其进行处理.否则,它将范围进一步细分为后续任务.
如果我不能指望使用偏移和限制来识别实体(因为它们的排序不能保证不变),也许我可以使用他们的密钥?但后来我可以发送1000个钥匙,这看起来很笨重.
我是在正确的道路上走下去,还是我应该考虑另一种设计?
我正在尝试使用 Google App Engine 队列 API,但在测试时遇到问题。似乎在流程的某些部分,CSRF 不起作用。
据我了解,api 在后台执行调用 url 和发出 http 请求的任务。
API调用的完整网址是?http://localhost.localdomain:8000/admin/cooking/recipe/36/chefworker/
当它引发此异常时:
Traceback (most recent call last):
File "/home/mariocesar/Proyectos/Cooking/cooking/django/core/handlers/base.py", line 100, in get_response
response = callback(request, *callback_args, **callback_kwargs)
File "/home/mariocesar/Proyectos/Cooking/cooking/django/views/decorators/csrf.py", line 24, in wrapped_view
resp.csrf_exempt = True
AttributeError: 'NoneType' object has no attribute 'csrf_exempt'
Run Code Online (Sandbox Code Playgroud)
因此,GAE api 为在后台执行任务而发出的请求中缺少 csrf 中间件、cookie、某些数据或响应本身。
如何在不禁用 Django 上的 CSRF 的情况下解决这个问题?但是,它完全可以与 djangoappengine 一起使用吗?
下面是我正在使用的 models.py 和 admin.py 文件。
模型.py
from django.db import models
class Recipe(models.Model):
name = models.CharField(max_length=140)
description = models.TextField()
cooking_time = …Run Code Online (Sandbox Code Playgroud) 我很惊讶地看到这个错误(甚至没有记录在配额中)......
超过100KB,我收到此错误:
TaskTooLargeError: Task size must be less than 102400
Run Code Online (Sandbox Code Playgroud)
关于如何处理这个问题的任何想法?
上下文:电子邮件正文(HTML)作为参数传递给任务队列.
我有一份工作要执行,将短信发送给用户。我想在指定的队列名称上运行此作业。例如,此作业已添加到“ SMS ”队列中。所以我找到了一种方法,但是存在一些错误。
创建作业实例并使用onQueue()函数执行以下操作:
$resetPasswordJob = new SendGeneratedPasswordResetCode(app()->make(ICodeNotifier::class), [
'number' => $user->getMobileNumber(),
'operationCode' => $operationCode
]);
$resetPasswordJob->onQueue('SMS');
$this->dispatch($resetPasswordJob);
Run Code Online (Sandbox Code Playgroud)
我的Job班级是这样的:
class SendGeneratedPasswordResetCode implements ShouldQueue
{
use InteractsWithQueue, Queueable;
/**
* The code notifier implementation.
*
* @var ICodeNotifier
*/
protected $codeNotifier;
/**
* Create the event listener.
*
* @param ICodeNotifier $codeNotifier
* @return self
*/
public function __construct(ICodeNotifier $codeNotifier)
{
$this->codeNotifier = $codeNotifier;
}
/**
* Handle the event.
*
* @return void
*/
public function handle()
{
echo …Run Code Online (Sandbox Code Playgroud) 我需要访问 Bull-queue 以查看工作统计信息并显示在页面上。我正在使用bull-repl从 CLI 访问队列,如下所示:
> bull-repl
BULL-REPL> connect marathon reddis://localhost:6379
Connected to reddis://localhost:6379, queue: marathon
BULL-REPL | marathon> stats
??????????????????????
? (index) ? Values ?
??????????????????????
? waiting ? 0 ?
? active ? 0 ?
? completed ? 55 ?
? failed ? 1 ?
? delayed ? 0 ?
? paused ? 0 ?
??????????????????????
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用以下代码从 JS 中执行相同的操作:
const shell = require('shelljs');
const ccommandExistsSync = require('command-exists').sync;
function installBullRepl(){
if(ccommandExistsSync('bull-repl')){
queueStats();
} else{
shell.exec('npm i -g …Run Code Online (Sandbox Code Playgroud) 我有一个工作服务,它将使用 Cv2 Dnn 执行图像处理。它经过优化以使用所有可用的 CPU,并且运行它的多个实例会降低性能。虽然它运行速度非常快,但如果同时添加两个图像,可能会导致 Dnn 崩溃。
出于这些原因,我希望有一个后台工作人员按顺序从队列中读取数据。所有传入请求都会将其图像添加到此队列并等待结果。
我希望实现的工作流程:
到目前为止,我已经看到了很多将项目推送到队列进行处理的方法,基本上都是“即发即忘”,但没有介绍如何等待项目完成处理。例如,在 Microsoft 关于带有托管服务的后台任务的文档中,他们的排队后台任务示例只是将多个任务推送到队列,然后在添加任务时读取服务,但调用代码不会等待待完成的任务
在我的本地开发环境中,当已添加到任务队列的App Engine任务遇到错误时,将重试该任务直到成功.但是,在生产环境中,它不是.我认为正在发生的是,因为我在urls.py中有一个自定义500处理程序,所有错误都被此捕获并且500错误从未冒泡到顶部.
这实际上可能是我的任务没有被重试的原因吗?如果是这样,有没有办法防止这种情况发生?我只希望处理程序500视图捕获错误,如果请求是用户生成的,而不是后端任务(对于那些,我希望错误冒泡并强制重试).
我在GAE中使用任务队列进行某些数据更新.
我的queue.xml文件如下所示
<queue>
<name>data-processing</name>
<rate>20/s</rate>
</queue>
Run Code Online (Sandbox Code Playgroud)
我的队列处理servlet为每个任务减少1.在处理过程中,它需要检查信用可用性,并且只有在可用信用额度时才能继续进
信用存储在表中,并在任务完成时更新.
我认为任务是线程并担心同步问题.
如果2个或更多任务同时查询/更新信用表怎么办?我需要创造一些锁定机制吗?如果是,那怎么样?
目前我有在后台运行的任务.任务完成后,我需要显示输出.我如何在Google App Engine中执行此操作?
一旦任务完成,我唯一能做的就是创建另一个应该显示输出的任务或者还有其他方法吗?
是否可以在GAE上设置精确或至少近似的计划任务执行时间,该任务将以指定的速率(5/s,100/h)执行?