我正在开发一个带有.Net(C ++)团队的应用程序,并提供一个COM接口来与python和其他语言进行交互。
我们发现通过COM推送数据的速度非常慢。
我考虑了几种选择:
根据您的经验,传递数据的最佳方式是什么?
答案 0 :(得分:9)
保持在Windows进程间通信机制中,我们使用 windows命名管道获得了积极的经验。
使用Windows重叠IO和pywin32中的win32pipe
模块。
您可以在Python Programming On Win32 一书中了解有关win32和python的更多信息。
发送部分只是写入r'\\.\pipe\mypipe'
。
侦听器(ovpipe
)对象包含一个事件句柄,等待包含可能的其他事件的消息涉及调用win32event.WaitForMultipleObjects
。
rc = win32event.WaitForMultipleObjects(
eventlist, # Objects to wait for.
0, # Wait for one object
timeout) # timeout in milli-seconds.
以下是python重叠监听器类的一部分:
import win32event
import pywintypes
import win32file
import win32pipe
class ovpipe:
"Overlapped I/O named pipe class"
def __init__(self):
self.over=pywintypes.OVERLAPPED()
evt=win32event.CreateEvent(None,1,0,None)
self.over.hEvent=evt
self.pname='mypipe'
self.hpipe = win32pipe.CreateNamedPipe(
r'\\.\pipe\mypipe', # pipe name
win32pipe.PIPE_ACCESS_DUPLEX| # read/write access
win32file.FILE_FLAG_OVERLAPPED,
win32pipe.PIPE_TYPE_MESSAGE| # message-type pipe
win32pipe.PIPE_WAIT, # blocking mode
1, # number of instances
512, # output buffer size
512, # input buffer size
2000, # client time-out
None) # no security attributes
self.buffer = win32file.AllocateReadBuffer(512)
self.state='noconnected'
self.chstate()
def execmsg(self):
"Translate the received message"
pass
def chstate(self):
"Change the state of the pipe depending on current state"
if self.state=='noconnected':
win32pipe.ConnectNamedPipe(self.hpipe,self.over)
self.state='connectwait'
return -6
elif self.state=='connectwait':
j,self.strbuf=win32file.ReadFile(self.hpipe,self.buffer,self.over)
self.state='readwait'
return -6
elif self.state=='readwait':
size=win32file.GetOverlappedResult(self.hpipe,self.over,1)
self.msg=self.strbuf[:size]
ret=self.execmsg()
self.state = 'noconnected'
win32pipe.DisconnectNamedPipe(self.hpipe)
return ret
答案 1 :(得分:2)
XML / JSON和Web服务或直接通过套接字。它也是独立于语言和平台的,所以如果你决定在UNIX上托管python部分,你可以,或者如果你想突然使用Java或PHP或几乎任何其他语言。
作为一般规则,像COM这样的专有协议/架构提供的限制比它们带来的好处更多。这就是开放式规范首先出现的原因。
HTH
答案 2 :(得分:2)
在命名管道上+1,但我还想从你的评论中添加它,看起来你的应用程序非常健谈。每次进行远程呼叫时,无论底层传输速度有多快,您都需要有固定的编组数据和建立连接的成本。如果将addpoint(lat,long)方法更改为addpoints(point_array)方法,则可以节省大量开销。这个想法类似于为什么我们有数据库连接池和http-keep-alive连接。实际通话越少越好。如果您可以限制对其进行的呼叫数量,那么您现有的COM解决方案甚至可能足够好。
答案 3 :(得分:0)
为每个替代方案设置测试并进行基准测试不应该太复杂。注意击败上下文敏感的经验数据...... :)
哦,如果你这样做,我相信很多人会对结果感兴趣。