一种在C++与Python模块间实现实时双向协助的通信方法与流程

文档序号:12664994阅读:327来源:国知局

本发明属于计算机应用程序转换研究领域,特别涉及一种在C++与Python模块间实现实时双向协助的通信方法。



背景技术:

目前,由于C++支持面向对象机制、泛型编程机制、异常处理、运算符重载,具有成熟可靠高效的标准模板库(STL),并且开发的程序执行效率高,所以C++被广泛地应用于计算机应用程序的开发。另外,Python是一种面向对象、解释型的计算机程序设计语言,它具有语法简单、跨平台、公用库多等特点,因此Python也得到了广泛的使用。但是,C++和Python均存在一定的缺点,例如C++语言本身复杂,学习周期比较长,公用库没有Python的公用库多,而Python是一门解释性语言,执行效率没有C++开发的程序高。通过Python的公用库,可灵活的获得大量的数据信息;将信息传递给C++程序,能具有更高的数据处理效率。

就目前的技术而言,C++能够单方面地调用Python功能模块,但是Python却不能单方面、直接地调用C++功能模块,Python可以通过间接的方法调用C++模块,但是这种间接调用是需要利用SWIG或者boost将C++功能模块封装为可以被Python调用的功能模块,这就增加了额外的工作量,不利于应用程序的开发。

因此,如果提供一种能够在C++功能模块和Python功能模块之间进行实时双向协助的通信方法,将大大提高程序开发的周期,具有重要的研究意义。



技术实现要素:

本发明的目的在于克服现有技术的缺点与不足,提供一种在C++与Python模块间实现实时双向协助的通信方法,该方法能够将C++的高效执行效率和Python的高效开发效率结合起来,大大地提高程序的开发效率,具有实时性、双向性、协助性和灵活性的优点。

本发明的目的通过以下的技术方案实现:一种在C++与Python模块间实现实时双向协助的通信方法,包括步骤:

(1)初始化阶段:将C++模块设定为服务端,Python模块设定为客户端,在C++模块内创建若干个socket实例;在Python模块内创建若干个socket实例,其中一个socket实例位于主线程,其中若干个socket实例位于子线程,C++模块和Python模块之间的通信通过socket实现,同时在服务端预定义一对应Python模块反馈信息的命令处理表;

(2)在Python模块里面,位于主线程的socket实例实时接收C++模块的命令请求,并在接收到命令请求后唤醒相应的子线程,位于子线程的socket实例对命令请求做出处理;如果处理过程中需要做出信息反馈或者调用C++内某功能模块,则通过socket实例发送反馈信息到C++模块,否则子线程继续等待下次被唤醒;

(3)C++模块接收到上述反馈信息后,根据命令处理表做出响应;如果在做出响应过程中需要做出信息反馈或调用Python内某功能模块,则返回重复执行步骤(2),否则处理结束,结束二者之间的通信;

(4)利用守护进程对服务端以及客户端进行状态监控,分别注册两个服务处理函数,用以对服务端和客户端的状态进行监控以及处理。

本发明的方法实现了C++模块和Python模块之间的相互的灵活调用,避免了使用SWIG来实现Python模块调用C++模块所带来的额外工作。

优选的,所述Python模块内创建有两个socket实例,一个socket实例位于主线程,用于接收C++模块的命令请求,另一个socket用于向C++模块做出信息反馈,其可嵌入到主线程外的任意需要反馈信息的函数里面。

更进一步的,对于Python模块,当位于主线程的socket实例还没有接收到命令请求时,该socket处于等待状态,子线程也处于等待状态,子线程的等待利用threading模块的Condition类来实现。

优选的,所述Python模块中socket实例发送或者接收的命令请求都是按照预定义格式的字符串,对于Python模块的socket接收的命令的格式是:“类名;函数名”或者“类名;函数名;字符串实参”。

更进一步的,在Python模块里面,子线程通过调用getattr()函数来进行命令处理,对于命令格式为“类名;函数名”的命令,其调用方式是getattr(object,name)(),对于命令格式为“类名;函数名;字符串实参”的命令,其调用方式是getattr(object,name)(param),其中object是类的实例,name是对应类的实例的成员函数,param是调用函数所需要的参数。

更进一步的,所述类的实例object是预先添加到字典类型里面的,并且该字典是一个全局类型的字典,其键-值的类型是:类名的字符串-对应类的实例。

更进一步的,Python模块的socket接收的命令利用了Queue模块里面的Queue类来装载的。

优选的,所述C++模块中socket实例发送或者接收的命令请求都是按照预定义格式的字符串,对于C++模块的socket接收的命令的格式是:“操作标识符;”或者“操作标识符;字符串实参”。

优选的,所述预定义的对应Python模块反馈信息的命令处理表相当于switch-case的条件分支处理模块,不同的条件分支对应着预定义的不同的处理函数段,根据命令的不同而选择不同的处理函数段。

优选的,所述的守护进程是利用服务以及服务控制管理器来实现,处理步骤如下:

(4-1)将服务端和客户端创建为服务,将这两个服务与服务控制管理器关联,服务控制管理器对这两个服务的状态进行实时监控;

(4-2)分别设置服务端和客户端的服务处理函数;

(4-3)当服务控制管理器发现服务的状态发生改变的时候,会把对应的服务状态传输给对应的服务,并触发相应的服务处理函数。

守护进程是为了解决发现问题和异常处理问题的进程,分别的处理过程是:

对于发现问题的进程,当客户端请求开启服务端,在客户端中设置相应的服务状态,服务控制管理器检测到状态发生了改变,就触发服务端的服务处理函数,从而开启服务端;

对于异常处理问题的进程,服务控制管理器进行如下处理:

a、自定义相关的服务状态值,这些值是一些异常状态值;

b、对于服务端有可能发生异常的地方以及相关的异常处理块用try-catch括起来;

c、当发生异常的时候,会触发catch内部的代码,在catch内部代码中,设置上述的异常状态值;

d、服务控制管理器检测到这些异常状态值,会触发服务端的服务处理函数,在这个函数内部做相应的异常处理。

本发明与现有技术相比,具有如下优点和有益效果:

1、本发明通过利用socket实现了通信的实时性,将C++模块作为服务端,Python模块作为客户端,能够在C++功能模块和Python功能模块之间建立实时的通信机制,并且这种通信是双向的,C++模块能够向Python模块传递信息,同时Python模块也可以向C++模块传递信息,能够将C++的高效执行效率和Python的高效开发效率结合起来,大大地提高了程序的开发效率。

2、本发明能够在客户端多创建几个socket,以满足不同的信息反馈的需求,使得Python模块与C++模块的交互更加灵活。

3、本发明利用多线程技术实现了通信的协助性,Python模块的主线程用来接收C++模块的命令请求,Python模块的子线程用来处理相应的命令请求,而C++模块接收到这些命令请求后,根据预定义的命令处理表做出相应的处理,能够使得程序更加稳定

4、本发明的方法实现了C++模块和Python模块之间的相互的灵活调用,避免了使用SWIG来实现Python模块调用C++模块所带来的额外工作。

5、本发明通过利用守护进程对服务端和客户端的状态进行监控,解决了发现问题以及异常处理问题,提高了模块之间的可靠性。

附图说明

图1是本发明方法的运作流程图。

具体实施方式

下面结合实施例及附图对本发明作进一步详细的描述,但本发明的实施方式不限于此。

实施例1

本实施例一种在C++与Python模块间实现实时双向协助的通信方法中,将C++模块设定为服务端,Python模块设定为客户端,二者内部均创建有socket实例,之间的通信通过socket实现,二者之间的状态监控是通过守护进程实现的,下面对服务端、客户端以及守护进程的工作流程分别进行具体说明。

服务端:

即C++模块,只创建一个socket,而且命令的接收和发送都位于主线程,命令的处理也位于主线程中,服务端的socket创建以及相关处理步骤如下:

1、创建一个socket实例,绑定端口号,绑定处理函数function1,设置处理标记为接入标记,也就是当Python模块请求接入的时候,处理函数function1将会调用;

2、当Python模块请求接入,步骤1的处理函数将被调用,在该处理函数里面,接受Python模块的请求接入,并且绑定另一个处理函数function2,设置处理标记为输入标记和关闭标记,也就是当Python模块向C++模块发送输入命令或者请求关闭连接的时候,处理函数function2将会被调用;当Python模块没有请求接入的时候,处理函数function2等待Python模块的命令请求;

3、当Python模块请求接入的时候,步骤2的处理函数function2将会被调用,在处理函数function2内部预先定义了一个命令处理表,该命令处理表类似于条件分支的处理结构,判定函数根据请求命令的不同而做出不同的条件分支的选择,不同的条件分支对应着预定义的不同的处理函数段;

4、在步骤3里面的不同条件分支处理函数段里面,根据不同的需求,可以利用socket向Python模块发送信息反馈。

客户端:

即Python模块,内部创建了两个socket,一个socket位于主线程,用于接收C++模块发送的命令请求,另一个socket用于向C++模块反馈信息。对于位于主线程的socket以及子线程对命令的处理,其处理步骤如下:

1、主线程的socket位于一个处于无限循环的while循环中,并且调用socket的recv()函数,由于recv()函数是阻塞型的函数,也就是当recv()函数还没有接收到命令请求的时候,它会一直等待;

2、当主线程的socket接收到BREAK命令的时候,唤醒并退出子线程,同时也退出主线程,并关闭两个socket;

3、当主线程的socket接收到非BREAK命令的时候,将命令放入到类型为Queue的命令队列里面,并且唤醒子线程,让子线程从命令队列里面取出一个命令,并对这个命令进行处理;

4、子线程利用getattr()函数对命令的进行处理,其处理步骤如下:

1)以英文模式的分号“;”为分界线对命令进行分开;

2)判断被分开后命令的个数,如果命令个数为2个,则以getattr(object,name)()的调用形式处理该命令;如果命令的个数为3个,则以getattr(object,name)(param)的调用形式处理该命令,其中object是类的实例,也是被分开的命令的第一个命令,name是对应类的实例的成员函数,也是被分开的命令的第二个命令,param是调用函数所需要的参数,也是被分开的命令的第三个命令;

3)子线程在处理命令的时候,根据是否需要对C++模块进行反馈,可以利用另一个socket发送命令;

4)当子线程处理完命令后,继续等待下一条命令。

为了提高模块之间的稳定性,在客户端接收服务端发送过来的命令之前,设置一个传输监控功能,其实现原理如下:

1、在服务端与客户端之间设置一个共享状态变量;

2、在服务端准备向客户端发送命令之前,改变上述的共享状态变量;

3、在客户端中时刻检测共享状态变量,当发现共享状态变量被改变之后,等待一段时间,等待结束后,检测命令队列里面是否存在命令,如果不存命令,则要求服务端重新发送命令。

守护进程:

守护进程是为了解决发现问题和异常处理问题的进程,在Windows上是利用服务以及服务控制管理器(Service Control Manager)来实现,其处理步骤如下:

1、将服务端和客户端创建为服务,将这两个服务与服务控制管理器关联,服务控制管理器对这两个服务的状态进行实时监控;

2、分别设置服务端和客户端的服务处理函数;

3、当服务控制管理器发现服务的状态发生改变的时候,会把对应的服务状态传输给对应的服务,并触发相应的服务处理函数。

对于发现问题,当客户端请求开启服务端,在客户端中设置相应的服务状态,服务控制管理器检测到状态发生了改变,就会触发服务端的服务处理函数,从而开启服务端。

对于异常处理问题,服务控制管理器仍然可以触发服务处理函数,其处理步骤如下:

1、自定义相关的服务状态值,这些值是一些异常状态值;

2、对于服务端有可能发生异常的地方以及相关的异常处理块用try-catch括起来;

3、当发生异常的时候,会触发catch内部的代码,在catch内部代码中,设置上述的异常状态值;

4、服务控制管理器检测到这些异常状态值,会触发服务端的服务处理函数,在这个函数内部做相应的异常处理。

本实施例方法利用socket实现了通信的实时性,实现了C++模块和Python模块之间的相互的灵活调用,避免了使用SWIG来实现Python模块调用C++模块所带来的额外工作,在程序开发过程中,由于兼具了C++的高效执行效率和Python的高效开发效率,因此开发效率更高,可应用于软件开发设备、测试设备等场合。

上述实施例为本发明较佳的实施方式,但本发明的实施方式并不受上述实施例的限制,其他的任何未背离本发明的精神实质与原理下所作的改变、修饰、替代、组合、简化,均应为等效的置换方式,都包含在本发明的保护范围之内。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1