有没有办法在google-app-engine的队列中传递多个参数?我使用下面的代码
Queue queue = QueueFactory.getQueue("sms-queue");
queue.add(TaskOptions.Builder.url("/SQ").param("id",pId));
Run Code Online (Sandbox Code Playgroud)
在我的servlet中,这个id是一个查询字符串.
long pID = Long.parseLong(req.getParameter("id"));
Run Code Online (Sandbox Code Playgroud)
我需要传递6个参数.
我正在使用芹菜进行分布式任务处理.我想在web主机上部署我的工作,只是为了展示我的项目的工作.那么我如何让djcelery使用数据库(sqlalchemy)作为django而不是rabbitmq或其他amqp服务器的后端.
我有几个我想在后台执行的操作,但它们必须一个接一个地同步执行.
我想知道使用Task.ContinueWith方法实现这一点是否是个好主意.你预见到这有什么问题吗?
我的代码看起来像这样:
private object syncRoot =new object();
private Task latestTask;
public void EnqueueAction(System.Action action)
{
lock (syncRoot)
{
if (latestTask == null)
latestTask = Task.Factory.StartNew(action);
else
latestTask = latestTask.ContinueWith(tsk => action());
}
}
Run Code Online (Sandbox Code Playgroud) 我知道(但我不明白)Celery可以使用Beanstalk作为传递机制.
"Beanstalk是一个简单,快速的工作队列."
来自Celery主页
"这是一个任务队列,专注于实时处理,同时也支持任务调度."
这看起来和我很相似.那么,为什么我会选择芹菜而不是简单的豆茎呢?或者为什么我会选择豆茎而不是成熟的芹菜呢?
我想在我的webapp中添加一个任务/工作队列,但我不知道该走哪条路.
我如何通过名字获得任务?
from google.appengine.api import taskqueue
taskqueue.add(name='foobar', url='/some-handler', params={'foo': 'bar'}
task_queue = taskqueue.Queue('default')
task_queue.delete_tasks_by_name('foobar') # would work
# looking for a method like this:
foobar_task = task_queue.get_task_by_name('foobar')
Run Code Online (Sandbox Code Playgroud)
应该可以使用REST API(https://developers.google.com/appengine/docs/python/taskqueue/rest/tasks/get).但我更喜欢类似的东西task_queue.get_task_by_name('foobar').有任何想法吗?我错过了什么?
我对Celery来说还很陌生,我想我已经读到某处内容,说明任务结果只在有限的时间内存在。但是,我的后端(redis)在通过它运行许多任务后变得非常肿。
有没有一种方法可以在任务结果上设置TTL,或者这是我需要手动清除(以及如何清除)的东西?
在发生事件之前,任务可以在任务队列中等待处理多长时间?如果不是永远,那么可能会发生什么?
我可以将大量任务添加到处理率非常低的队列中,并在几天/几周/几个月内处理它们吗?
如果任务等待时间过长,是否会从队列中弹出?
maximum countdown/ETA for a task:30 days from the current date and time
Run Code Online (Sandbox Code Playgroud)
我认为这是在谈论有意/有计划地在未来设置 eta,而不是允许任务等待多长时间。
我正在使用Amazon SQS实现一个任务队列(但我想这个问题适用于任何任务队列),其中工作人员需要采取不同的操作,具体取决于已经重新尝试作业的次数(将其移至一个不同的队列,增加可见性超时,发送警报..等等)
什么是跟踪失败的工作计数的最佳方法?我想避免为工作保留一个集中式数据库:重试计数记录.我应该在监控过程中查看在队列中花费的时间吗?国际海事组织最好是丑陋或不干净,迭代工作直到找到古老的工作.
谢谢!安德拉斯
我想测试在某些情况下该作业是否已被释放回队列中。
这是我的工作类别:
class ChargeOrder extends Job
{
use InteractsWithQueue, SerializesModels;
/**
* The order model which is to be charged
*/
protected $order;
/**
* The token or card_id which allows us to take payment
*/
protected $source;
/**
* Create a new job instance.
*
* @param App\Order $order;
* @param string $source;
* @return array
*/
public function __construct($order, $source)
{
$this->order = $order;
$this->source = $source;
}
/**
* Execute the job.
*
* @return void
*/ …Run Code Online (Sandbox Code Playgroud) 如果我有一个类,其中包含稍后要执行的任务队列,并且我有一个async Task<T>方法,那么如何将该异步方法排入队列而不执行它?
我想“延迟”此任务,并确保调用者看到它稍后运行,就像在方法体中等待它一样。--- 调用者不应该知道我已将任务排队以供稍后使用。
现在,如果我的队列已满,我会构造并返回一个Task<T>未运行的新的,它返回.Result我的私有异步方法:
public async Task<T> ExecuteAsync<T>(T transaction) {
if (mustDelay) {
Task<T> task = new Task<T>(t => executeAsync((T) t).Result, transaction);
enqueue(task);
return await task;
}
return await executeAsync(transaction);
}
private async Task<T> executeAsync<T>(T transaction) {
await someWork();
return transaction;
}
Run Code Online (Sandbox Code Playgroud)
当其他任务完成时,我使Start()该任务出队:
dequeuedTask.Start();
Run Code Online (Sandbox Code Playgroud)
这是否确保调用者看到与仅从方法返回等待结果相同的同步?
task-queue ×10
celery ×3
python ×3
c# ×2
task ×2
amazon-sqs ×1
amqp ×1
asynchronous ×1
beanstalkd ×1
distributed ×1
django ×1
java ×1
jobs ×1
laravel ×1
redis ×1
testing ×1