我们现在有以下项目结构:
我们决定保持这些模块完全独立,并将它们移动到不同的docker容器中.当来自用户的查询到达Web服务器时,它会向分析模块发送另一个查询以获取建议.
为了使建议保持一致,我们需要定期进行一些背景计算,例如,当新用户在我们的系统中注册时.此外,一些后台任务完全与Web服务器逻辑相关联.为此,我们决定使用分布式任务队列,例如Celery.
有以下可能的任务创建和执行方案:
到目前为止,我在这里看到了使用Celery的3个相当奇怪的可能性:
I.芹菜在单独的容器中,做一切
这样,我们就失去了隔离,因为Celery容器和其他容器共享了这些功能.
II.芹菜在单独的容器中,并且做得少得多
与我相同,但现在任务只是对Web服务器和分析模块的请求,这些请求在那里异步处理,结果在任务内部轮询,直到准备就绪.
这样,我们从拥有经纪人中受益,但所有繁重的计算都来自Celery工作人员.
III.每个容器中分开芹菜
这样,在web服务器上安排的任务可以在分析模块中执行.但是,仍然需要跨容器共享任务代码或使用虚拟任务,此外,还需要在每个容器中运行芹菜工作者.
执行此操作的最佳方法是什么,或者逻辑应该完全更改,例如,将所有内容移动到一个容器中?
我希望能够做到这一点:
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。有什么优雅的解决方法吗?
我无法修改UPDA和B。
我正在使用支持库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
我正在开发具有罗盘功能的iOS应用程序.我试图使用CMMagnetometerData更新,提供未经校准但正常的结果.
在那之后,我试图得到CMDeviceMotion更新,结果总是给出零磁场的CMMagneticFieldCalibrationAccuracyUncalibrated准确性.我唯一的设备是iPad,因此无法测试其他设备.
可能是场为零,因为传感器未校准,但我找不到任何方法来执行校准.
如何解决?
更新:
这里建议使用startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:,但它并没有为我工作.
这里建议设置showsDeviceMovementDisplay到true.然而它也没有用,校准窗口就不会弹出.
最后,求助了.根据我的观察:
1)使用startDeviceMotionUpdatesUsingReferenceFrame:toQueue:withHandler:与referenceFrame不等于allZeros或XArbitraryZVertical.
2)设置showsDeviceMovementDisplay为true.
经过精确的零值更新后,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) android ×1
celery ×1
docker ×1
ios ×1
ipad ×1
magnetometer ×1
objective-c ×1
python ×1
python-3.7 ×1
savestate ×1
swift ×1