6

我正在做一个项目,我将有一个 C# 应用程序和另一个 Python 应用程序。C# 应用程序将持续分析数据流并在每次检测到有趣的东西时引发一个标志。因此,每次发生事件时,我的 Python 应用程序都必须读取它并继续它自己的进程,而其他标志将继续发送。正如您所了解的,C# 应用程序不会等待 Python 应用程序在发送另一个标志之前完成其计算。

所以我想知道是否可以创建一个 sub/pub(C# 是发布者,Python 是订阅者),如果可以,我该怎么做,你认为这是个好主意吗?我在这个领域很新,所以你能告诉我是否还有其他可能性吗?

谢谢你的帮助。

4

3 回答 3

4

Redis pub/sub很棒……或者ZeroMQ

于 2012-07-07T01:13:19.273 回答
2

最简单的方法是PIPE沟通。另一种不建议的简单方法是SOCKET编程。管道命名管道是在不同进程之间(通过不同的编程语言)进行通信的良好解决方案。SOCKET编程是这样的,但可能需要更多的访问级别并且可能安全性较低。

其他类型的IPC似乎无法使用。

查看更多信息:

于 2012-07-07T09:27:40.093 回答
0

您可以使用我们的aktos-dcsaktos-dcs-cs库。我已经成功地在生产中使用了这些库,以使 RFID 阅读器(来自 Impinj)与我们的遥测系统进行通信(实际上,集成在其中)。RFID 阅读器有一个 C# API,我们在遥测系统中大量使用 Python。

最简单的测试用例是一个 pinger-ponger 应用程序,下面是这些库的样子:

pinger.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using aktos_dcs_cs;

namespace pinger
{
    class Pinger : Actor
    {
        public void handle_PingMessage(Dictionary<string, object> msg)
        {
            Console.WriteLine("Pinger handled PingMessage: {0} ", msg["text"]);

            string msg_ser = @"
                    {""PongMessage"": 
                        {""text"": ""this is proper message from csharp implementation""}
                    }
                ";
            System.Threading.Thread.Sleep(2000);
            send(msg_ser);
        }

    }


    class Program
    {
        static void Main(string[] args)
        {
            Pinger x = new Pinger(); 
            Actor.wait_all(); 
        }
    }
}

ponger.py:

from aktos_dcs import *

class Pinger(Actor):
    def handle_PingMessage(self, msg_raw):
        msg = get_msg_body(msg_raw)
        print "Pinger got ping message: ", msg['text'], (time.time() - msg_raw['timestamp'])
        sleep(2)
        self.send({'PongMessage': {'text': "Hello ponger, this is pinger 1!"}})

if __name__ == "__main__":
    ProxyActor()
    pinger = Pinger()
    pinger.send({'PongMessage': {'text': "Hello ponger, this is STARTUP MESSAGE!"}})

    wait_all()
于 2016-01-14T11:08:43.580 回答