小编Tzo*_*ker的帖子

多个Docker容器和芹菜

我们现在有以下项目结构:

  1. 处理来自客户端的传入请求的Web服务器.
  2. 分析模块,为用户提供一些建议.

我们决定保持这些模块完全独立,并将它们移动到不同的docker容器中.当来自用户的查询到达Web服务器时,它会向分析模块发送另一个查询以获取建议.

为了使建议保持一致,我们需要定期进行一些背景计算,例如,当新用户在我们的系统中注册时.此外,一些后台任务完全与Web服务器逻辑相关联.为此,我们决定使用分布式任务队列,例如Celery.

有以下可能的任务创建和执行方案:

  1. 在Web服务器上排队的任务,在Web服务器上执行(例如,处理上传的图像)
  2. 在网络服务器上排队的任务,在分析模块执行(例如,计算新用户的建议)
  3. 任务在分析模块中排队并在那里执行(例如,定期更新)

到目前为止,我在这里看到了使用Celery的3个相当奇怪的可能性:

I.芹菜在单独的容器中,做一切

  1. 将Celery移动到单独的docker容器中.
  2. 提供来自Web服务器和分析的所有必要包以执行任务.
  3. 与其他容器共享任务代码(或在Web服务器和分析中声明虚拟任务)

这样,我们就失去了隔离,因为Celery容器和其他容器共享了这些功能.

II.芹菜在单独的容器中,并且做得少得多

相同,但现在任务只是对Web服务器和分析模块的请求,这些请求在那里异步处理,结果在任务内部轮询,直到准备就绪.

这样,我们从拥有经纪人中受益,但所有繁重的计算都来自Celery工作人员.

III.每个容器中分开芹菜

  1. 在Web服务器和分析模块中运行Celery.
  2. 将(分析任务的)虚拟任务声明添加到Web服务器.
  3. 添加2个任务队列,一个用于Web服务器,一个用于分析.

这样,在web服务器上安排的任务可以在分析模块中执行.但是,仍然需要跨容器共享任务代码或使用虚拟任务,此外,还需要在每个容器中运行芹菜工作者.

执行此操作的最佳方法是什么,或者逻辑应该完全更改,例如,将所有内容移动到一个容器中?

celery docker

9
推荐指数
1
解决办法
3635
查看次数

Singledispatch和类型作为输入参数

我希望能够做到这一点:

from typing import Type
from functools import singledispatch

class A:
    pass

class B(A):
    pass

@singledispatch
def foo(arg):
    print('default')

@foo.register
def _(arg: Type[A]):
    print(arg)

foo(A)
foo(B)
Run Code Online (Sandbox Code Playgroud)

但是,我得到 Invalid annotation for 'arg'. typing.Type[__main__.arg] is not a class.

我想singledispatch暂时还不能完全支持typing。有什么优雅的解决方法吗?

我无法修改UPDAB

python python-3.7 python-typing

7
推荐指数
1
解决办法
171
查看次数

FragmentManager.getFragment()NullPointerException

我正在使用支持库v4并且无法保存片段的状态.

@Override
protected void onSaveInstanceState(Bundle outState)
{
    ...
    if(mFragment != null)
        getSupportFragmentManager().putFragment(outState, "frag", mFragment);
    ...
}
@Override
protected void onCreate(Bundle savedInstanceState)
{
    ...
    if(savedInstanceState != null)
    {
        //Here I get NullPointerException
        getSupportFragmentManager().getFragment(savedInstanceState, "frag");
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

当我调用getFragment()时抛出NullPointerException(savedInstanceState包含带有"frag"的条目).

这是logcat输出的一部分:

04-18 00:10:56.719: E/AndroidRuntime(14644): Caused by: java.lang.NullPointerException
04-18 00:10:56.719: E/AndroidRuntime(14644):    at android.support.v4.app.FragmentManagerImpl.getFragment(FragmentManager.java:569)
Run Code Online (Sandbox Code Playgroud)

我也试图调用getFragments()哪个返回null.这在我看来很奇怪.

我将不胜感激任何帮助!


解:

我忘了使用super.onSaveInstanceState(outState);里面的onCreate方法.

android savestate android-fragments android-fragmentactivity android-support-library

5
推荐指数
1
解决办法
5614
查看次数

CMDeviceMotion返回磁场的0值

我正在开发具有罗盘功能的iOS应用程序.我试图使用CMMagnetometerData更新,提供未经校准但正常的结果.

在那之后,我试图得到CMDeviceMotion更新,结果总是给出零磁场的CMMagneticFieldCalibrationAccuracyUncalibrated准确性.我唯一的设备是iPad,因此无法测试其他设备.

可能是场为零,因为传感器未校准,但我找不到任何方法来执行校准.

如何解决?

更新:

这里建议使用startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:,但它并没有为我工作.

这里建议设置showsDeviceMovementDisplaytrue.然而它也没有用,校准窗口就不会弹出.

最后,求助了.根据我的观察:

1)使用startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:referenceFrame不等于allZerosXArbitraryZVertical.

2)设置showsDeviceMovementDisplaytrue.

经过精确的零值更新后,CMMagneticFieldCalibrationAccuracyUncalibrated它将正常化.

码:

...
motionManager.deviceMotionUpdateInterval = 0.05
motionManager.showsDeviceMovementDisplay = true 
motionManager.startDeviceMotionUpdatesUsingReferenceFrame(CMAttitudeReferenceFrame.XArbitraryCorrectedZVertical, toQueue: NSOperationQueue.mainQueue(), withHandler:handleUpdate)
...
private func handleUpdate(data: CMDeviceMotion!, error: NSError!) {
    if data != nil {
        let field = data.magneticField.field
        println("\(field.x), \(field.y), \(field.z)")
    }
}
Run Code Online (Sandbox Code Playgroud)

objective-c magnetometer ipad ios swift

5
推荐指数
1
解决办法
1443
查看次数