我一直在与我的同事讨论是否使用virtual关键字为重写方法添加前缀,或者仅在原始基类中添加前缀.
我倾向于使用virtual关键字为所有虚拟方法(即涉及vtable查找的方法)添加前缀.我的理由是三重的:
鉴于C++缺少override关键字,virtual关键字的存在至少会通知您该方法涉及查找,理论上可以通过进一步的特化来覆盖,或者可以通过指向更高基类的指针来调用.
始终使用这种风格意味着,当你没有virtual关键字看到(在我们的代码至少)的方法,你可以初步认为它既不是从基础衍生也不专门的子类.
如果,通过一些错误,虚拟从IFoo中删除,所有子节点仍将起作用(CFooSpecialization :: DoBar仍会覆盖CFooBase :: DoBar,而不是简单地隐藏它).
正如我所理解的那样,反对这种做法的论点是,"但这种方法不是虚拟的"(我认为这种方法无效,并且来自对虚拟性的误解),并且"当我看到虚拟关键字时,我希望意味着有人从中衍生出来,然后去寻找它们."
假设的类可以分布在几个文件中,并且有几个专门化.
class IFoo {
public:
virtual void DoBar() = 0;
void DoBaz();
};
class CFooBase : public IFoo {
public:
virtual void DoBar(); // Default implementation
void DoZap();
};
class CFooSpecialization : public CFooBase {
public:
virtual void DoBar(); // Specialized implementation
};
Run Code Online (Sandbox Code Playgroud)
从风格上讲,你会从两个派生类中删除虚拟关键字吗?如果是这样,为什么?Stack Overflow的想法是什么?
我打算使用Celery来处理由我的主服务器发送的事件触发的推送通知和电子邮件.
这些任务需要打开与外部服务器(GCM,APS,电子邮件服务器等)的连接.它们可以一次处理一个,也可以通过单个连接批量处理,以获得更好的性能.
通常会在短时间内单独触发这些任务的几个实例.例如,在一分钟的时间内,可能会有几十个推送通知需要通过不同的消息发送给不同的用户.
在芹菜中处理这个问题的最佳方法是什么?似乎天真的方式是为每条消息简单地创建一个不同的任务,但这需要为每个实例打开一个连接.
我希望会有某种任务聚合器允许我处理例如"所有未完成的推送通知任务".
这样的事情存在吗?有没有更好的方法来解决它,例如附加到活动任务组?
我错过了什么吗?
罗伯特
我有芹菜和芹菜(四名工人)批量做一些加工步骤.其中一项任务大致是这样的,"对于每个没有创建Y的X,创建Y."
该任务以半快速(10秒)定期运行.任务很快完成.还有其他任务正在进行中.
我多次遇到这个问题,其中节拍任务显然已经积压,因此同时执行相同的任务(来自不同的节拍时间),导致错误的重复工作.似乎任务也是无序执行的.
是否有可能限制芹菜节拍以确保一次只有一个突出的任务实例?设置类似于rate_limit=5任务的东西是"正确"的方式吗?
是否有可能确保按顺序执行节拍任务,例如,不是分派任务,节拍将其添加到任务链中?
处理这个问题的最佳方法是什么,除了使这些任务本身以原子方式执行并且可以安全地同时执行?这不是我对预期任务的限制......
任务本身是天真地定义的:
@periodic_task(run_every=timedelta(seconds=10))
def add_y_to_xs():
# Do things in a database
return
Run Code Online (Sandbox Code Playgroud)
这是一个实际的(清理过的)日志:
[00:00.000]foocorp.tasks.add_y_to_xs发送.ID - >#1[00:00.001] 收到的任务:foocorp.tasks.add_y_to_xs [#1][00:10.009]foocorp.tasks.add_y_to_xs发送.ID - >#2[00:20.024]foocorp.tasks.add_y_to_xs发送.ID - >#3[00:26.747] 收到的任务:foocorp.tasks.add_y_to_xs [#2][00:26.748] TaskPool:应用#2[00:26.752] 收到的任务:foocorp.tasks.add_y_to_xs [#3][00:26.769] 接受的任务:foocorp.tasks.add_y_to_xs [#2] pid:26528[00:26.775] 任务foocorp.tasks.add_y_to_xs [#2]成功完成0.0197986490093s:无[00:26.806] TaskPool:应用#1[00:26.836] TaskPool:应用#3[01:30.020] 接受的任务:foocorp.tasks.add_y_to_xs [#1] pid:26526[01:30.053] 接受的任务:foocorp.tasks.add_y_to_xs [#3] pid:26529[01:30.055] foocorp.tasks.add_y_to_xs [#1]:为X id添加Y#9725[01:30.070] foocorp.tasks.add_y_to_xs [#3]:为X id添加Y#9725[01:30.074] 任务foocorp.tasks.add_y_to_xs [#1]成功完成0.0594762689434s:无[01:30.087] 任务foocorp.tasks.add_y_to_xs [#3]成功完成0.0352867960464s:无我们目前正在使用带有RabbitMQ的Celery 3.1.4作为传输.
编辑丹,这是我想出的: …
celery ×2
python ×2
aggregation ×1
asynchronous ×1
c++ ×1
celerybeat ×1
coding-style ×1
concurrency ×1
methods ×1
rabbitmq ×1
task ×1