使用Akka Actor调用或传递消息到Python代码
我有一些用Python写的分析代码。目前我在用Storm来处理数据流。因为Storm允许通过消息序列化来调用Python代码,所以我可以在我的Storm处理单元中从Java或Scala调用Python代码。
我发现了Pykka,这是一个Python实现的演员模型。我在想有没有办法从Akka演员中调用Python代码?比如说,能不能把消息从Akka演员传递给Pykka演员?
2 个回答
你也可以使用Jep
在Java虚拟机(JVM)中运行嵌入式的CPython
,这样就能完全访问本地的(C语言写的)Python
包。
可以查看这里的第5张幻灯片Mixing Python and Java。
如果你需要的Python包不是线程安全的,那就可以使用远程的Akka
演员(actor)。可以参考这个链接:https://github.com/alpinedatalabs/alpine-r/blob/35209af47f896450e4f8f8745a80595d01035ca3/server/src/main/resources/application.conf#L4
为了让Scala
和Python
之间的交互更顺畅,可以尝试ScalaPy
,它也是基于Jep
构建的。
从技术上讲,类似的方式也可以用于R语言,使用Renjin
,不过要注意,因为它是GPL
许可的,所以在运行嵌入式时要小心。
我怀疑这两种远程演员模型的通信协议能否轻松连接起来,但你可以在Scala代码和Python应用之间使用0MQ。Akka支持通过0MQ发送消息,所以经过一些设置后,Scala代码可以像处理其他演员一样处理Python应用,虽然我不太确定这在Python那边意味着什么。
另一个值得考虑的方案是使用Jython在JVM上运行你的Python分析代码。你可以让一个Scala演员调用Jython的函数或方法。但是如果你的Python代码使用了C扩展模块,你就得找其他的替代方案。
还有一种可能性(假设你不使用C扩展模块)是试试转换器py2scala;对于数据分析代码来说,它可能表现得不错。可以推测这将是性能最好的解决方案。