我正在与一个团队在 .Net (C++) 中开发一个应用程序,并提供一个 COM 接口(interface)来与 python 和其他语言进行交互。
我们发现通过 COM 推送数据的速度非常慢。
我考虑过几种选择:
- 转储数据到文件,并通过com发送文件路径
- 通过 mmap 共享内存?
- 直接通过套接字流式传输数据?
根据您的经验,传递数据的最佳方式是什么?
最佳答案
在 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
关于python - 将数据从 python 传输到 Windows 中的另一个应用程序的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/286614/